简单的0-1背包问题,大家都会做的。题意不想解释太多。
简述题目的案例及以几个关键
Sample Input
1 //测试组数T
5 10 //骨头总个数N,背包总体积V
1 2 3 4 5 //N块骨头各自的价值
5 4 3 2 1 //N块骨头各自的体积
Sample Output //输出最大价值
14
注意:每种骨头只有一块,不然理解不了案例的Output是14。
骨头的价值和体积要分开输入。
最精髓的应该就是这句吧,可惜自己还不会融会贯通=_=||
dp[j]=max(dp[j],dp[j-volume[i]]+value[i]);
#include<iostream> #include<cstring> using namespace std; #define maxn 1001 int N,T,V,i,j,ans; int value[maxn],volume[maxn],dp[maxn]; int max(int a,int b) { return a>b?a:b; } void DP(int n,int v) { ans=0; memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) for(j=v;j>=volume[i];j--) { dp[j]=max(dp[j],dp[j-volume[i]]+value[i]); ans=max(ans,dp[j]); } cout<<ans<<endl; } int main() { cin>>T; while(T--) { cin>>N>>V; for(i=1;i<=N;i++) cin>>value[i]; for(i=1;i<=N;i++) cin>>volume[i]; DP(N,V); } return 0; }
时间: 2024-10-26 00:45:00