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;

}




posted @ 2011-12-21 00:33  快乐.  阅读(136)  评论(0编辑  收藏  举报