01背包问题
来源:互联网 发布:曲面电视优缺点知乎 编辑:程序博客网 时间:2024/06/10 21:18
问题描述
给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.
输入格式
输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。
以后N行每行两个数Wi和Vi,表示物品的重量和价值
输出格式
输出1行,包含一个整数,表示最大价值。
样例输入
3 5
2 3
3 5
4 7
样例输出
8
数据规模和约定
给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.
输入格式
输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。
以后N行每行两个数Wi和Vi,表示物品的重量和价值
输出格式
输出1行,包含一个整数,表示最大价值。
样例输入
3 5
2 3
3 5
4 7
样例输出
8
数据规模和约定
1<=N<=200,M<=5000.
方法1:
#include <iostream>#include <cstring>using namespace std;int main(){ int n,c; cin>>n>>c; /*这里要注意数组申请空间是要多申请一个 0号位赋值为0,这是为了在递推过程中f[][1]或f[1][]的值可正常推出 */ int *weight=new int[n+1];//重量 int *value=new int[n+1]; //价值 int **f=new int*[n+1];// f[i][j]表示在背包容量为j的情况下, 前i件宝贝的最大价值 for(int i=0; i<=n; i++) { f[i]=new int[c+1]; } for(int i=0; i<=n; i++) f[i][0]=0; for(int i=0; i<=c; i++) f[0][i]=0; for(int i=1; i<=n; i++) { cin>>weight[i]>>value[i]; }/* | 0 i=0 or w=0 f[i,w]=| f[i-1,w] wi>w | max(vi+f[i-1,w-wi],f[i-1,w]) i>0 and w>=wi*/ for(int i=1; i<=n; i++) { for(int j=1; j<=c; j++) { if(j<weight[i]) //背包装不下第i个物品,f[][]为前i-1件物品的最大价值 f[i][j]=f[i-1][j]; else //背包可以装下第i个物品,如果放比不放价值大,则放 f[i][j]=max(f[i-1][j],f[i-1][j-weight[i]]+value[i]); } } cout<<f[n][c]<<endl; return 0;}//这种方法空间利用率不高!!!
方法2:(用一维数组实现)
#include <iostream>#include <cstring>using namespace std;int main(){ int n;//物品个数 int c;//背包容量 cin>>n>>c; int *weight=new int[n];//重量 int *value=new int[n]; //价值 for(int i=0; i<n; i++) { cin>>weight[i]>>value[i]; } //数组多申请一个元素,容量从0~C, int dp[c+1]; memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) { for(int j=c;j>0;j--) //j为背包容量,其中容量为0时,价值势必为0,所以更新dp[]时,不用循环dp[0] { if(j>=weight[i]) dp[j]=max(dp[j],dp[j-weight[i]]+value[i]); } } cout<<dp[c]<<endl; return 0;}
其中代码的第24~31行可以简化,如下:
for(int i=0; i<n; i++) { for(int j=c; j>=weight[i]; j--) //j为背包容量,其中容量为0时,价值势必为0,所以更新dp[]时,不用循环dp[0] { dp[j]=max(dp[j],dp[j-weight[i]]+value[i]); } }
阅读全文
0 0
- 背包问题---01背包
- DP 背包问题 01背包
- 01背包--苹果,背包问题
- 01背包 完全背包问题
- 背包问题之01背包
- 背包问题之01背包
- 背包问题1:01背包
- 背包问题《1》01背包
- 01背包+完全背包问题
- 背包问题-背包01-苹果
- 背包问题之01背包
- 背包问题(01背包,完全背包,多重背包)
- 背包问题(01背包,完全背包,多重背包)
- 动态规划-----背包问题-----01背包,完全背包,多重背包
- 经典背包问题 01背包+完全背包+多重背包
- 背包(01背包、完全背包、多重背包)问题总结
- 背包问题(01背包,完全背包,多重背包)
- 经典背包问题 01背包+完全背包+多重背包
- bzoj3162 独钓寒江雪
- java集合ArrayList
- 二路归并排序及其改进方法
- 项目管理中的变更管理
- centos6.5配置tomcat和redis的开机启动
- 01背包问题
- 从零开始python小案例003计算北京市个人所得税
- DenseCap:Fully Convolutional Localization Networks for Dense Captioning
- 【2017年cs231n学习笔记1】Lecture2 K近邻 距离度量 超参数 交叉验证 线性分类器
- Java.11.03
- MySQL——索引的使用对查询、插入速度的影响
- ABP官方文档(四十一)【ASP.NET Core】
- Leetcode 303
- Centos7 配置 JDK8