HDU 1114

 

http://acm.hdu.edu.cn/showproblem.php?pid=1114

完全背包问题

两个代码 内外循环次序互换了

代码一:

46MS 228K 724 B
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
const int inf=6000005;
using namespace std;
int dp[10003],w[505],v[505];
int main()
{
int CASE,E,F,empty,n,i,j;
scanf("%d",&CASE);
while(CASE--)
{
scanf("%d%d%d",&E,&F,&n);
empty=F-E;
for(i=1;i<=n;i++)
scanf("%d%d",&v[i],&w[i]);
for(i=1;i<=empty;i++)
dp[i]=inf;
dp[0]=0;

for(i=1;i<=n;i++) //外层循环为种类
for(j=w[i];j<=empty;j++)
{
//if(j>=w[i])
dp[j]=min(dp[j],dp[j-w[i]]+v[i]);
}

if(dp[empty]==inf)
printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[empty]);

}
return 0;
}

代码2

125MS 228K 713 B

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
const int inf=6000005;
using namespace std;
int dp[10003],w[505],v[505];
int main()
{
int CASE,E,F,empty,n,i,j;
scanf("%d",&CASE);
while(CASE--)
{
scanf("%d%d%d",&E,&F,&n);
empty=F-E;
for(i=1;i<=n;i++)
scanf("%d%d",&v[i],&w[i]);
for(i=1;i<=empty;i++)
dp[i]=inf;
dp[0]=0;
for(j=0;j<=empty;j++) //外侧循环为容量
for(i=1;i<=n;i++)
{
if(j>=w[i])
dp[j]=min(dp[j],dp[j-w[i]]+v[i]);
}

if(dp[empty]==inf)
printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[empty]);

}
return 0;
}




posted @ 2011-12-24 10:15  快乐.  阅读(348)  评论(2编辑  收藏  举报