HDU 1114
http://acm.hdu.edu.cn/showproblem.php?pid=1114
完全背包问题
两个代码 内外循环次序互换了
代码一:
|
#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
|
#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;
}