现在的位置: 首页 > 综合 > 正文

HDU 2602 Bone Collector

2014年01月17日 ⁄ 综合 ⁄ 共 961字 ⁄ 字号 评论关闭

题目链接: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[n][v]<<endl;
 }
 return 0;

 

 

抱歉!评论已关闭.