动态规划之背包问题
2018-01-23 15:37
211 查看
问题描述:
问题可以描述为:有 N 件物品和一个容量为 V 的背包。第 i 件物品的体积是 s[i],其价值是 v[i]。求解,在不超过背包容量情况下,将哪些物品装入背包可使价值总和最大。
思路:
动态规划。令V[i][j]代表,从前i项物品中取出若干项,装入体积为j的背包中能得到的最大价值。那么很自然的,V[i][j]是下面两个量的最大值:
1.V[i-1][j],也就是,第i项物品不放进背包,仅用最优的方法在前i-1项物品中选取若干项物品去装入体积为j的背包所得到的价值最大值。
2.V[i-1,j-s[i]]+v[i],也就是,第i项物品要放进背包。用最优的方法在前i-1项物品中选取若干项物品去装入体积为j-s[i] (s[i]是第i项物品的体积)的背包所得到的价值最大值,再加上第i项物品的价值。这有个条件,即j>=s[i]。
代码
问题可以描述为:有 N 件物品和一个容量为 V 的背包。第 i 件物品的体积是 s[i],其价值是 v[i]。求解,在不超过背包容量情况下,将哪些物品装入背包可使价值总和最大。
思路:
动态规划。令V[i][j]代表,从前i项物品中取出若干项,装入体积为j的背包中能得到的最大价值。那么很自然的,V[i][j]是下面两个量的最大值:
1.V[i-1][j],也就是,第i项物品不放进背包,仅用最优的方法在前i-1项物品中选取若干项物品去装入体积为j的背包所得到的价值最大值。
2.V[i-1,j-s[i]]+v[i],也就是,第i项物品要放进背包。用最优的方法在前i-1项物品中选取若干项物品去装入体积为j-s[i] (s[i]是第i项物品的体积)的背包所得到的价值最大值,再加上第i项物品的价值。这有个条件,即j>=s[i]。
代码
#include<iostream> using namespace std; int main() { const int N=6;//代表物品个数,物品编号从1开始 const int C=10;//代表背包体积 int V[N+1][C+1];//V[i][j]代表,从前i项物品中取出若干项,装入体积为j的背包中能得到的最大价值 int s[N+1]={0,5,6,5,1,19,7};//6个物品的体积 int v[N+1]={0,2,3,1,4,6,5};//6个物品的价值 for(int i=0;i<=N;i++) V[i][0]=0;//初始化,背包体积为0,肯定价值为0 for(int j=0;j<=C;j++) V[0][j]=0;//初始化,不能选物品,肯定价值为0 for (int i=1;i<=N;i++) for(int j=1;j<=C;j++) { V[i][j]=V[i-1][j]; if(s[i]<=j&&(V[i][j]<V[i-1][j-s[i]]+v[i])) V[i][j]=V[i-1][j-s[i]]+v[i]; } return V [C]; }
相关文章推荐
- 编程练习:动态规划0-1背包问题
- 动态规划+背包问题
- 动态规划之背包问题
- 洛谷 1064——金明的预算方案(动态规划的背包问题)
- 动态规划:二维费用的背包问题
- 动态规划--背包问题、比值问题转背包问题
- 0-1背包问题的动态规划解法
- 动态规划——背包问题变形 收藏
- 动态规划:HDU2159-FATE(二维费用的背包问题)
- 0-1背包问题的动态规划求解
- 动态规划和贪心算法之背包问题理解
- 动态规划——0-1背包问题
- 04动态规划进阶---背包问题
- 动态规划-0-1背包问题
- 为什么0-1背包问题是NP完全问题,但该问题还有动态规划的解法?
- 动态规划0—1背包问题
- HDU 2159 FATE (动态规划dp之二维完全背包问题)
- 动态规划解0-1背包问题
- 动态规划求0-1背包问题
- 动态规划之0-1背包问题