1270:【例9.14】混合背包

简介: 1270:【例9.14】混合背包

时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

一个旅行者有一个最多能装V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn。有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

【输入】

第一行:二个整数,M(背包容量,M<=200),N(物品数量,N<=30);

第2..N+1行:每行三个整数Wi,Ci,Pi,前两个整数分别表示每个物品的重量,价值,第三个整数若为0,则说明此物品可以购买无数件,若为其他数字,则为此物品可购买的最多件数(Pi)。

【输出】

仅一行,一个数,表示最大总价值。

【输入样例】

10  3

2  1  0

3  3  1

4  5  4

【输出样例】

11

【提示】

选第一件物品1件和第三件物品2件。

1. #include <iostream>
2. #include <cstdio>
3. using namespace std;
4. int n,m;
5. int w[35];//体积
6. int c[35];//价值
7. int p[35];//数量
8. int f[205];//状态
9. int main()
10. {
11.   scanf("%d %d",&m,&n);
12.   for(int i=1;i<=n;i++)
13.     scanf("%d %d %d",&w[i],&c[i],&p[i]);
14.   //朴素算法 数据大会超时
15.   for(int i=1;i<=n;i++){//物品
16.     for(int j=m;j>=w[i];j--){//容量
17.       if(p[i]==0){
18.         for(int k=0;k*w[i]<=j;k++){//数量
19.           f[j]=max(f[j],f[j-k*w[i]]+k*c[i]);
20.         } 
21.       }
22.       else {
23.         for(int k=0;k<=p[i]&&k*w[i]<=j;k++){//数量
24.           f[j]=max(f[j],f[j-k*w[i]]+k*c[i]);
25.         }
26.       }
27. 
28.     }
29.   }
30.   printf("%d\n",f[m]);
31. return 0;
32. }
相关文章
|
运维 负载均衡 网络协议
linux网络管理(链路聚合、桥接网络、故障排查、常用工具)
网卡的链路聚合就是将多块网卡连接起来,当一块网卡损坏,网络依旧可以正常运行,可以有效的防止因为网卡损坏带来的损失,同时也可以提高网络访问速度。
1663 0
linux网络管理(链路聚合、桥接网络、故障排查、常用工具)
|
Linux
Linux VXLAN小实验
该文介绍了如何在两台运行CentOS 7的Linux主机(T620和T630)之间建立VXLAN隧道。通过配置VXLAN ID、远程和本地IP,以及设置隧道接口和路由,实现10.0.10.12和10.0.10.13之间的通信。文中提供了详细的配置命令,并展示了成功ping通和抓包的验证结果。
251 4
|
Linux 编译器 网络安全
linux 交叉编译libcurl库
linux 交叉编译libcurl库
884 1
|
Shell Linux 开发工具
Linux中Ctrl+C,Ctrl+Z,Ctrl+D说明
Ctrl+C:送SIGINT信号,默认进程会结束,但是进程自己可以重定义收到这个信号的行为。 Ctrl+Z:送SIGSTOP信号,进程只是被停止,再送SIGCONT信号,进程继续运行。
4728 0
1008 数组元素循环右移问题
1008 数组元素循环右移问题
74 0
|
Linux
zynq操作系统: Linux驱动开发串口波特率 非标准波特率 10mb
zynq操作系统: Linux驱动开发串口波特率 非标准波特率 10mb
931 0
zynq操作系统: Linux驱动开发串口波特率 非标准波特率 10mb
1349:【例4-10】最优布线问题
1349:【例4-10】最优布线问题
182 0