C++动态规划算法之0-1背包问题
2017-08-24 13:47
295 查看
0-1背包问题
题目描述
有 n 件物品, 每件物品有一个价值和一个重量,分别记为: b1,b2, …bn w1,w2, …wn 其中所有的 重量wi 均为整数。 现有一个背包,其最大载重量为W,要求从这n件物品中任取若干件(这些物品要么被装入要么被留下)。问背包中装入哪些物品可使得所装物品的价值和最大?
输入
第1行:2个整数n(1<=n<=1000)和W(1<=W<=10000),分别表示物品的件数和背包的最大载重量。
第2-n+1行:每行2个用空格分开的整数,第i+1行的整数表示第i件物品的重量wi和价值bi(1<=bi,wi<=10000)。
输出
第1行:1个整数,表示背包所能装下的物品的最大总价值。
第2-?行:每行3个用空格分开的整数,i, wi, bi,分别表示最优解中的物品的编号、重量和价值。
样例输入
样例输出
题目分析
有 n 件物品, 每件物品有一个价值和一个重量,分别记为: b1,b2, …bn w1,w2, …wn 其中所有的 重量wi 均为整数。 现有一个背包,其最大载重量为W,要求从这n件物品中任取若干件(这些物品要么被装入要么被留下)。问背包中装入哪些物品可使得所装物品的价值和最大?
第1行:2个整数n(1<=n<=1000)和W(1<=W<=10000),分别表示物品的件数和背包的最大载重量。
第2-n+1行:每行2个用空格分开的整数,第i+1行的整数表示第i件物品的重量wi和价值bi(1<=bi,wi<=10000)。
第1行:1个整数,表示背包所能装下的物品的最大总价值。
第2-?行:每行3个用空格分开的整数,i, wi, bi,分别表示最优解中的物品的编号、重量和价值。
4 5 2 3 3 4 4 5 5 6
7 1 2 3 2 3 4
题目分析
这道题是背包问题的其中一种,除此之外还有部分背包问题、完全背包问题、多重背包问题等,我就不一一介绍了。所谓0-1背包问题,0就是指不要此件物品,1就是指要这件物品,也就是说你不能像部分背包问题那样把物品分开。而且每种物品只有一件,不可以像完全背包问题、多重背包问题那样有很多件。这道题还在原来的基础上要求了输出物品序号,对生活中的我们都更加实用。话不多说,下面是代码:
#include<cstdio> #include<iostream> using namespace std; int N,W,b[1002],w[1002],f[1002][10002]; void wxy(int i,int j) { if(!i) return ; if(w[i]>j||f[i-1][j]>=f[i-1][j-w[i]]+b[i]) wxy(i-1,j); else { wxy(i-1,j-w[i]); cout<<i<<" "<<w[i]<<" "<<b[i]<<endl; } } int main() { cin>>N>>W; for(int i=1;i<=N;i++) cin>>w[i]>>b[i]; for(int i=1;i<=N;i++) for(int j=1;j<=W;j++) { if(w[i]>j) f[i][j]=f[i-1][j]; else f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+b[i]); } cout<<f [W]<<endl; wxy(N,W); }
相关文章推荐
- C++实现动态规划算法之解决0-1背包问题
- 最简单的0-1背包问题c++代码实例及运行结果
- 动态规划解背包问题/C++/Knapsack problem
- C++ 贪心算法部分背包问题
- 0-1背包问题(动态规划算法)
- 0-1背包问题:C++
- 动态规划算法分析及实例——求解完全背包问题(java实现)
- 01背包问题的动态规划算法、蛮力法和空间优化算法
- 最简单的0-1背包问题c++代码实例及运行结果
- 调用c++递归库文件解决背包问题
- 01背包问题动态规划算法
- C++回溯法0/1背包问题DKNAP
- C++ 实现 0-1 背包问题
- 最简单的0-1背包问题c++代码实例及运行结果
- 0/1背包问题 - 暴力法(C++实现)
- 动态规划算法0-1背包问题java实现
- 01背包问题的C/C++实现
- c++实现0-1背包问题完整源码(动态规划实现)
- 庆功会 多重背包问题c++
- 最简单的0-1背包问题c++代码实例及运行结果