您的位置:首页 > 其它

用动态规划求解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]

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: