题目: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;
}