您的位置:首页 > 其它

HDU 2602 Bone Collector

2015-05-09 08:14 211 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602

 

用二维数组做的。。。。

该题是一道背包题,并且是一个0,1背包,这种背包特点是:每种物品仅有一件,可以选择放或不放。

用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:

f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。

#include <iostream>
using namespace std;

int dp[1050][1050];

int value[1050], volume[1050];

int main()
{
int t, n, v, i, j;
cin>>t;
while(t--)
{
memset(dp,0,sizeof(dp));
cin>>n>>v;
for(i = 1; i <= n; i++)
cin>>value[i];
for(j = 1; j <= n; j++)
cin>>volume[j];

for(i = 1; i <= n; i++)
for(j = 0; j <= v; j++)
{
if(j>=volume[i] && dp[i-1][j-volume[i]]+value[i]>dp[i-1][j])
{
dp[i][j] = dp[i-1][j-volume[i]]+value[i];
}
else
{
dp[i][j] = dp[i-1][j];
}
}

cout<<dp
[v]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: