HDOJ2602(DP0-1背包)

来源:互联网 发布:手机怎样看淘宝的积分 编辑:程序博客网 时间:2024/05/01 08:08
http://acm.hdu.edu.cn/showproblem.php?pid=2602

Bone Collector

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K(Java/Others)
Total Submission(s): 11339 Accepted Submission(s):4370


Problem Description
Many years ago , in Teddy’s hometown there was a man who wascalled “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 histrip of collecting there are a lot of bones , obviously , differentbone has different value and different volume, now given the eachbone’s value along his trip , can you calculate out the maximum ofthe total value the bone collector can get ?
HDOJ2602(DP0-1背包)


 

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


 

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


 

Sample Input
1 5 10 1 23 4 5 5 4 3 2 1


 

Sample Output
14


 

Author
Teddy


 

Source
HDU 1st “Vegetable-Birds Cup” Programming Open Contest


 

Recommend
lcy
具体解法我就不说了。。不会的看背包九讲(重温这题就是为了弄解法1的)不过有三个小问题要注意。。f数组一定要初始化,要不然WA。。还有就是return f[m]与return f[n];居然都能AC。。这个我暂时不理解。。。不过还是建议returnf[m]..三.是由于题目并没有要求一定要把背包装满所以数组初始化的时候应该将f[0..V]全部设为0。
解法1:15MS292K574 B
#include<stdio.h>
#include<string.h>
int
n,m;
int
f[2010],weight[2010],cost[2010];
int
max(intx,int y)
{

   return
x>y?x:y;
}

int
zeroonepack(intcost,int weight)
{

   int
i;
   for
(i=m;i>=cost;i--)
       f[i]=max(f[i],f[i-cost]+weight);
   return
f[n];
}

int
main()
{

   int
t;
   scanf("%d",&t);
   while
(t--)
   {

       scanf("%d%d",&n,&m);
       int
i;
       for
(i=1;i<=n;i++)
           scanf("%d",&weight[i]);
       for
(i=1;i<=n;i++)
           scanf("%d",&cost[i]);
       memset(f,0,sizeof(f));//这一步一定不可少
       for
(i=1;i<=n;i++)
           zeroonepack(cost[i],weight[i]);
       printf("%d\n",f[m]);
   }

   return
0;
}
 
解法215MS264K484 B
#include<stdio.h>
#include<string.h>
intf[2010]={0},c[1010],w[1010];
int
max(intx,inty)
{

   if
(x>y)returnx;
    elsereturn
y;
}

int
main()
{

   int
T;
   scanf("%d",&T);
   while
(T--)
   {

       int
n,v,i,j;
       scanf("%d%d",&n,&v);
       for
(i=1;i<=n;i++)
           scanf("%d",&w[i]);
       for
(i=1;i<=n;i++)
           scanf("%d",&c[i]);
       memset(f,0,sizeof(f));
       for
(i=1;i<=n;i++)
       {

           for
(j=v;j>=c[i];j--)
               f[j]=max(f[j],f[j-c[i]]+w[i]);
       }

       printf("%d\n",f[v]);
   }

   return
0;
}
原创粉丝点击