HDU-2602,Bone Collector(01背包)

简介: HDU-2602,Bone Collector(01背包)

Problem Description:


Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …

The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?


Input:


The first line contain a integer T , the number of cases.

Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.


Output:


One integer per line representing the maximum of the total value (this number will be less than 231).


Sample Input:


1


5 10


1 2 3 4 5


5 4 3 2 1


Sample Output:


14


解题思路:


这是个典型的01背包问题,状态转移方程模板如下:

for(int i=1;i<=n;i++)
{
    for(int j=V;j>=v[i];j--)
    {
  dp[j]=max(dp[j],dp[j-v[i]]+d[i]);
    }
}


程序代码:


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX=1001;
int dp[MAX],d[MAX],v[MAX];
int t,n,V;
int main()
{
  scanf("%d",&t);
  while(t--)
  {
    memset(dp,0,sizeof(dp));
    scanf("%d %d",&n,&V);//n代表骨头的总数,V代表袋子的容积 
    for(int i=1;i<=n;i++)
      scanf("%d",&d[i]);//每个骨头的价值 
    for(int j=1;j<=n;j++)
      scanf("%d",&v[j]);//每个骨头的容积 
    for(int i=1;i<=n;i++)
    {
      for(int j=V;j>=v[i];j--)
      {
        dp[j]=max(dp[j],dp[j-v[i]]+d[i]); 
      }//容积减去相应的骨头的容积,同时加上这个骨头的价值 
    }
    printf("%d\n",dp[V]);
  }
  return 0;
}



相关文章
|
8月前
|
Java
hdu-2602-Bone Collector
hdu-2602-Bone Collector
36 0
POJ-2488,A Knight's Journey(DFS)
POJ-2488,A Knight's Journey(DFS)
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
洛谷P2871-[USACO07DEC]Charm Bracelet S(01背包模板题)
Funny Car Racing - 最短路小技巧
题意: n个路口,m条街道,每条街道都是有向的 并且这m条街道open a秒 close b秒(循环往复),自己的车通过这条道路需要t秒 可以从路口等待某一条道路open,必须在道路close 之前通过,且必须在另一条道路open的时候进入 问能否从s点到达t点,如果不能,输出-1,如果能输出最短的时间 细节的地方加在了代码里,在建图的过程中,如果说a > t,那么说这条路无论如何是走不过去的,所以干脆直接不建边
101 0
|
Java 数据安全/隐私保护
[LintCode] Number of Islands(岛屿个数)
描述 给一个01矩阵,求不同的岛屿的个数。 0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。 样例 在矩阵: [ [1, 1, 0, 0, 0], [0, 1, 0, 0, 1], [0, 0, 0, 1, 1], [0, 0, 0, 0, 0], [0, 0, 0, 0, 1] ] 中有 3 个岛。
1255 0
|
存储 算法 测试技术