用动态规划求解0-1背包问题
2010-06-23 15:55
281 查看
[问题描述]:
在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W·2……Wn,与之相对应的价值为P1,P2……Pn。求出获得最大价值的方案。
[解法]:
考虑用动态规划的方法来解决,这里的:
阶段是:在前N件物品中,选取若干件物品放入背包中;
状态是:在前N件物品中,选取若干件物品放入所剩空间为W的背包中的所能获得的最大价值;
决策是:第N件物品放或者不放;
由此可以写出动态转移方程:
我们用f[i,j]表示在前 i 件物品中选择若干件放在所剩空间为 j 的背包里所能获得的最大价值
f[i,j]=max{f[i-1,j-Wi]+Pi (j>=Wi), f[i-1,j]}
这样,我们可以自底向上地得出在前M件物品中取出若干件放进背包能获得的最大价值,也就是f[m,w]
在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W·2……Wn,与之相对应的价值为P1,P2……Pn。求出获得最大价值的方案。
[解法]:
考虑用动态规划的方法来解决,这里的:
阶段是:在前N件物品中,选取若干件物品放入背包中;
状态是:在前N件物品中,选取若干件物品放入所剩空间为W的背包中的所能获得的最大价值;
决策是:第N件物品放或者不放;
由此可以写出动态转移方程:
我们用f[i,j]表示在前 i 件物品中选择若干件放在所剩空间为 j 的背包里所能获得的最大价值
f[i,j]=max{f[i-1,j-Wi]+Pi (j>=Wi), f[i-1,j]}
这样,我们可以自底向上地得出在前M件物品中取出若干件放进背包能获得的最大价值,也就是f[m,w]
#include<iostream> using namespace std; int knapsack(int m, int n ,int c[10][100]) { int i,j,w[10],p[10]; cout << "input weight,value" << endl; for(i=1;i<n+1;i++) cin >> w[i] >> p[i]; /*初始化数组*/ for(i=0;i<10;i++) for(j=0;j<100;j++) c[i][j] = 0; for(i=1;i<n+1;i++) for(j=1;j<m+1;j++) { if(w[i]<=j) /*如果当前物品的容量小于背包容量*/ { /*如果本物品的价值加上背包剩下的空间能放的物品的价值*/ if(p[i]+c[i-1][j-w[i]]>c[i-1][j]) /*大于上一次选择的最佳方案则更新c[i][j]*/ c[i][j]=p[i]+c[i-1][j-w[i]]; else c[i][j]=c[i-1][j]; } else c[i][j]=c[i-1][j]; } return(c [m]); } int main() { int c[10][100];/*对应每种情况的最大价值*/ int m;//最大容量 int n;//物品个数 int i,j; cout << "input 最大容量值m,物品个数n" << endl; cin >> m >> n; cout << knapsack(m, n, c) << endl; }
相关文章推荐
- 用动态规划求解0-1背包问题
- 0-1背包问题及其动态规划求解之二——王晓东的书本解法
- 0/1背包问题-----动态规划求解
- 动态规划求解背包问题(JAVA实现)
- 动态规划求解0-1背包问题
- Java 动态规划求解0-1背包问题
- 背包问题,动态规划求解,matlab代码,c++代码
- 物件捆绑 背包问题 动态规划 求解
- 动态规划求解0/1背包问题
- 0-1背包问题,动态规划求解
- 动态规划求解01背包相关的基本问题
- 《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解
- 动态规划求解背包问题(java版本)
- 算法导论第16章 贪心算法-0-1背包问题—动态规划求解
- 动态规划求解0-1背包问题
- 《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解
- 动态规划求解0-1背包问题
- 0/1背包问题(动态规划求解)
- 动态规划之最长公共子序列、最长公共子串和背包问题
- POJ 3132 Sum of Different Primes 动态规划 DP 0-1背包问题