1017 Problem Q
题意:一个容量为V的背包,放入体积和价值不同的骨头,求所能放入的骨头的最大价值。
思路:0-1背包问题,只要判断前一块骨头是否放入背包,状态方程为dp[i]=max(dp[i],dp[i-w[j]]+v[j])。其中w[j]表示当前骨头的体积,v[j]表示当前骨头的价值。
感想:背包问题,关键还是当前值,与前一状态值的判断比较。
#include<iostream>
#include<string.h>
using namespace std;
int w[1005],v[1005],dp[1005];
int main(){
int i,j,n,m,t;
cin>>t;
while(t--){
cin>>n>>m;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
cin>>v[i];
for(i=1;i<=n;i++)
cin>>w[i];
for(i=1;i<=n;i++)
for(j=m;j>=0;j--){
if(j>=w[i])
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
cout<<dp[m]<<endl;
}
return 0;
}