简单0-1背包问题

Bone Collector

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


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 2 31).
 

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

Sample Output
  
  
14
 

#include<iostream>
using namespace std;
int m[1000][1000],v[1000],w[1000];
int main()
{
	int y;
	cin>>y;
	while(y--)
	{
	   int a,b;
	   int i ,j;
	   cin>>a>>b;

	
	for(i=0;i<a;++i)
		cin>>v[i];
	for(i=0;i<a;++i)
		cin>>w[i];

	
	for(j=0;j<=b;++j)
	  if(j<w[a-1])
		 m[a-1][j]=0;
	  else
		 m[a-1][j]=v[a-1];


      for(i=a-2;i>=0;--i)
		for(j=0;j<=b;++j)
		{
			m[i][j]=m[i+1][j];
			if(j>=w[i])
			{	
				if(m[i+1][j-w[i]]+v[i]>m[i+1][j])
					m[i][j]=v[i]+m[i+1][j-w[i]];
			}
		}
	/*	for(i=0;i<3;++i)
		for(j=0;j<=10;++j)
			{
			 	cout<<m[i][j]<<"  ";
		        if(j==10)
			    cout<<endl;
		}
		*/
		//cout<<i<<"  "<<j<<endl;
		cout<<m[i+1][j-1]<<endl;
	}
	return 0;

}

这个是一位数组实现的:
#include<iostream>  
using namespace std;  
int m[1000],v[1000],w[1000];  
int main()  
{  
    int y;  
    cin>>y;  
    while(y--)  
    {  
       int a,b;  
       int i ,j;  
       cin>>a>>b;  
	   memset(m,0,sizeof(m));  
    for(i=1;i<=a;++i)  
        cin>>v[i];  
    for(i=1;i<=a;++i)  
        cin>>w[i];  
       for(i=1;i<=a;++i)  
        for(j=b;j>=w[i];--j)  
        {  
           if(j>=w[i])  
            {     
                if(m[j-w[i]]+v[i]>m[j])  
                    m[j]=v[i]+m[j-w[i]];  
            }  
	    }  
	cout<<m[b]<<endl;  
    }  
    return 0;    
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值