当前位置: 首页 > news >正文

多重背包转01背包优化

服务器好好玩。

题目描述

lcy0x1 去服务器的系统商店买东西。

一个人的背包有 21 格。

一开始他的背包里有 m 件不同的物品(不能卖)。

他要买 n 种物品,第 i 件物品的名字为 sti​,有 ai​ 件,价值为 bi​,一格可以放 ci​ 个。

相同的物品可以放同一格(只要没放满)。

问:他跑一次最多能卖多少钱。

输入格式

第一行两个整数 m,n。

下面 n 行,第 i+1 行三个整数 ai​,bi​,ci​ 与一个字符串 sti​。

输出格式

最多卖的钱 s。

输入输出样例

输入 #1复制

20 3
63 1 64 yinshifen
1 10 1 men
1 1 64 yinshifen

输出 #1复制

64

说明/提示

数据保证:

  • 0≤m≤21;
  • 0≤n≤100;
  • 0≤ai​≤1344;
  • 0≤bi​≤104;
  • 0<ci​≤64;
  • 0<∣sti​∣<100;
  • 0≤s≤106。

注:数据强大,搜索 0 分,请使用多重背包。

#include<bits/stdc++.h>

using namespace std;

int f[10000];

struct goods{

    int piece,price,number,value;

    char name[101];

}p [1345];

int m,n;

int main(){

    cin>>m>>n;

    m=21-m;

    for(int i=1;i<=n;i++){

        int a,b,c;

        cin>>p[i].piece>>p[i].price>>p[i].number>>p[i].name;//结构体输入

        for(int j=1;j<=n;j++){

            if(i!=j&&strcmp(p[i].name,p[j].name)==0){//如果这次输入的名字和已输入的名字一样(strcmp是判断两个字符串点的差的函数,如果差是0说明相等)

                if(p[j].piece+p[i].piece<=p[j].number){//如果两个加起来可以放到一组里

                    p[j].piece+=p[i].piece;//在之前的那一组里加上去

                    n--;//总的物品数减一

                    i--;//将这一组重新输入新的值

                    break;

                }

                else {//两个加起来比一组多

                    p[i].piece=p[i].piece-(p[j].number-p[j].piece);//那么记录多出来的

                    p[j].piece=p[j].number;//原来的达到最大值

                    //因为可能有好几组名字相同的,所以这里不能用break结束循环

                }

            }

        }

    }

    for(int i=1;i<=n;i++){//每一组都算出这一组的价值

        p[i].value=p[i].piece*p[i].price;

    }

    for(int i=1;i<=n;i++){//01背包问题解决

        for(int j=m;j>=1;j--){

            f[j]=max(f[j],f[j-1]+p[i].value);

        }

    }

    cout<<f[m];//输出

    return 0;

}

相关文章:

  • Linux:进程:进程状态
  • ServletContextAttributeListener 的用法笔记250417
  • StarCraftII SMAC 环境配置的debug日记
  • #include <bits/stdc++.h> 头文件解析 [特殊字符]‍[特殊字符]
  • STM32F103_HAL库+寄存器学习笔记17 - CAN中断接收 + 接收CAN总线所有报文
  • Wireshark TS | 异常 ACK 数据包处理
  • 新手拥有一个服务器能做什么?
  • 赋能能源 | 智慧数据,构建更高效智能的储能管理系统
  • 东莞SMT贴片加工工艺升级与生产优化
  • Win10如何一键切换IP地址教程
  • 【零基础】基于DeepSeek-R1与Qwen2.5Max的行业洞察自动化平台
  • 实现定时发送邮件,以及时间同步
  • 【Unity】UI点击事件处理器
  • CS144 Lab0实战记录:搭建网络编程基础
  • 【Leetcode 每日一题 - 补卡】1534. 统计好三元组
  • HBuilder安装PHP开发插件教程
  • 浔川AI翻译v7.0更新预告
  • 深度解析Spring @Scheduled:从基础使用到高级定制
  • Java反射知识点学习笔记
  • VS Code 安装及常用插件
  • 神十九都带回了哪些实验样品?果蝇等生命类样品已交付科学家
  • 马上评|什么才是地方文旅宣传的正确姿势
  • 文天祥与“不直人间一唾轻”的元将唆都
  • 遭遇大规模停电,西班牙内政部宣布进入国家紧急状态
  • 上海出台灵活就业人员公积金新政:不限户籍、提取自由,6月起施行
  • 美军空袭也门拘留中心,已致68人死亡