DHU 2602(01背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2602
本来想小复习一下,没想到居然被虐。。。
开始用的二维,没有化,一直WA
修改后的代码
二维:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
__int64 dp[1001][1001];
int W[1001],V[1001];
int main()
{
int CASE,i,j;
int Sum,bag;
cin>>CASE;
while(CASE--)
{
cin>>Sum>>bag;
for(i=1;i<=Sum;i++)
cin>>V[i];
for(i=1;i<=Sum;i++)
cin>>W[i];
memset(dp,0,sizeof(dp));
for(i=1;i<=Sum;i++)
for(j=0;j<=bag;j++) //从0开始,有的骨头没体积,有价值。无语
{
if(j>=W[i]&&dp[i-1][j]<dp[i-1][j-W[i]]+V[i])
dp[i][j]=dp[i-1][j-W[i]]+V[i];
else
dp[i][j]=dp[i-1][j];
}
printf("%d\n",dp[Sum][bag]);
}
return 0;
}
一维:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int dp[1001];
int W[1001],V[1001];
int main()
{
int CASE,i,j;
int Sum,bag;
cin>>CASE;
while(CASE--)
{
cin>>Sum>>bag;
for(i=1;i<=Sum;i++)
cin>>V[i];
for(i=1;i<=Sum;i++)
cin>>W[i];
memset(dp,0,sizeof(dp));
for(i=1;i<=Sum;i++)
for(j=bag;j>=W[i];j--)
{
dp[j]=max(dp[j],dp[j-W[i]]+V[i]);
}
printf("%d\n",dp[bag]);
}
return 0;
}