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. }
相关文章
|
10月前
1360:奇怪的电梯(lift)
1360:奇怪的电梯(lift)
|
10月前
1335:【例2-4】连通块
1335:【例2-4】连通块
|
10月前
1336:【例3-1】找树根和孩子
1336:【例3-1】找树根和孩子
|
10月前
|
算法 C++ 容器
C/C++趣味程序设计百例(71~80)
C/C++趣味程序设计百例(71~80)
378 0
|
10月前
10点小游戏 2021-04-22
10点小游戏 2021-04-22
|
10月前
|
C++
C++ 绘制圣诞树 (找规律 多层循环)
C++ 绘制圣诞树 (找规律 多层循环)
496 0
|
Unix Linux API
开源库介绍:libusb 及其使用
开源库介绍:libusb 及其使用
2639 0
开源库介绍:libusb 及其使用
|
存储 人工智能 算法
C++如何处理图的存储方式
C++如何处理图的存储方式
209 0
C++如何处理图的存储方式
|
JavaScript Ubuntu Java
零基础开发 nginx 模块
推荐学习资料: * nginx 开发指南: http://nginx.org/en/docs/dev/development_guide.html * nginx 动态模块编译博客文章: https://www.nginx.com/blog/compiling-dynamic-modules-nginx-plus/ * nginx 源码: https://github.com/nginx
4341 1