思路:
1.设dp[i][j]
为前i
个物品中,可以装进体积为j
的背包里,所有物品的最大值;
2.设val[i]
为第i
个物品的价值,vol[i]
为第i
个物品的体积,则我们可以得到
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX_N=1001;
const int MAX_V=1001;
int dp[MAX_N][MAX_V]; //前i个骨头装进体积为j的背包,价值的最大值
int val[MAX_N];
int vol[MAX_N];
void clear(int& n,int& v){
for(int i=1;i<=n;i++) val[i]=vol[i]=0;
for(int i=0;i<=n;i++){
for(int j=0;j<=v;j++) dp[i][j]=0;
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,v;
scanf("%d%d",&n,&v);
for(int i=1;i<=n;i++) scanf("%d",val+i);
for(int i=1;i<=n;i++) scanf("%d",vol+i);
for(int j=vol[1];j<=v;j++) dp[1][j]=val[1];
for(int i=2;i<=n;i++){
for(int j=0;j<=v;j++){
if(vol[i]>j) dp[i][j]=dp[i-1][j];
else dp[i][j]=max(dp[i-1][j],dp[i-1][j-vol[i]]+val[i]);
}
}
printf("%d
",dp[n][v]);
clear(n,v);
}
return 0;
}