Bone Collector
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 47894 Accepted Submission(s): 19983
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 ?
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.
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
Autho
Teddy
Source
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<climits>
#include<string>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
#define rep(i,j,k)for(i=j;i<k;i++)
#define per(i,j,k)for(i=j;i>k;i--)
#define MS(x,y)memset(x,y,sizeof(x))
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long LL;
const int INF=0x7ffffff;
#define lson rt<<1, l, m
#define rson rt<<1|1, m+1, r
int dp[1000][1000];
int main()
{
int t,n,v,i,j;
int va[1000],vo[1000];
cin>>t;
while(t--)
{
cin>>n>>v;
for(i=1;i<=n;i++)
cin>>va[i];
for(i=1;i<=n;i++)
cin>>vo[i];
memset(dp,0,sizeof(dp));//初始化操作
for(i=1;i<=n;i++){
for(j=0;j<=v;j++){
if(vo[i]<=j)//表示第i个物品将放入大小为j的背包中
dp[i][j]=max(dp[i-1][j],dp[i-1][j-vo[i]]+va[i]);//第i个物品放入后,那么前i-1个物品可能会放入也可能因为剩余空间不够无法放入
else //第i个物品无法放入
dp[i][j]=dp[i-1][j];
}
}
cout<<dp[n][v]<<endl;
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<climits>
#include<string>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
#define rep(i,j,k)for(i=j;i<k;i++)
#define per(i,j,k)for(i=j;i>k;i--)
#define MS(x,y)memset(x,y,sizeof(x))
typedef long long LL;
const int INF =0x7FFFFFFF;
const int low(int x){return x&-x;}
const int M=1000+1;
int val[M],vol[M];
int flag[M][M];
int t,i,j,n,k,m,v;
int F(int v,int n)
{
int remax;
if(flag[v][n]!=-1)remax=flag[v][n];
else if(n==0){
if(v>=vol[n])remax=val[n];
else remax=0;
}
else if(v>=vol[n])
remax=max(F(v,n-1),F(v-vol[n],n-1)+val[n]);
else remax=F(v,n-1);
flag[v][n]=remax;
return remax;
}
int main()
{
scanf("%d",&t);
while(t--){
cin>>n>>v;
rep(i,0,n)scanf("%d",&val[i]);
rep(i,0,n)scanf("%d",&vol[i]);
MS(flag,-1);
printf("%d\n",F(v,n-1));
}
return 0;
}