您的位置:首页 > 其它

01背包问题

2015-09-19 01:08 357 查看
参考了http://www.cnblogs.com/qinyg/archive/2012/04/26/2471829.html

关键的状态转移方程如下

令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数:

(1) V(i,0)=V(0,j)=0

(2) V(i,j)=V(i-1,j) j<wi

V(i,j)=max{V(i-1,j) ,V(i-1,j-wi)+vi) } j>wi

(1)式表明:如果第i个物品的重量大于背包的容量,则装人前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,即物品i不能装入背包;第(2)个式子表明:如果第i个物品的重量小于背包的容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量位j-wi 的背包中的价值加上第i个物品的价值vi; (b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。

用poj3624练手

第一次开二维dp数组,直接超内存

第二次用两个一维数组交替,内存是没超,但是耗时400多ms,而且代码比较丑陋

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

int dp[12900];
int w[3410], d[3410];

int main()
{
int n, m;
cin >> n >> m;

memset(dp, 0, sizeof(dp));

for (int i = 1; i <= n; i++)
{
cin >> w[i] >> d[i];
}

for (int i = 1; i <= n; i++)
{

for (int j = m; j > 0; j--)
{
int x = dp[j];
int y = 0;
if(j >= w[i])
y = dp[j - w[i]] + d[i];
dp[j] = x < y ? y : x;
}
}

cout << dp[m] << endl;

//system("pause");
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: