题目:http://acm.hdu.edu.cn/showproblem.php?pid=2602
代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; int n[1111],v[1111]; int dp[1111]; int Max(int x,int y) { return x>y?x:y; } int main() { int t; scanf("%d",&t); while(t--) { int a,b; cin>>a>>b; for(int i=1; i<=a; i++) { cin>>v[i]; } for(int i=1; i<=a; i++) { cin>>n[i]; } memset(dp,0,sizeof(dp)); for(int i=1; i<=a; i++) { for(int j=b; j>=n[i]; j--) { dp[j]=max(dp[j],dp[j-n[i]]+v[i]); } } cout<<dp[b]<<endl; } }
#include<iostream> using namespace std; int dp[1000][1000]; int max(int x,int y) { return x>y?x:y; } 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; }