完全背包是0-1背包的拓展。
方法一:内存空间开销大
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0X3F3F3F3F
int T,E,F,R,N,dp[505][10005];
struct Pt{
int p;
int w;
}P[505];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&E,&F);
R=F-E;
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d%d",&P[i].p,&P[i].w);
memset(dp,INF,sizeof(dp)); // 因为本题要求刚好达到F-E的值,所以初始化为最大值,
dp[0][0]=dp[1][0]=0; // 且dp[0][0]=dp[1][0]=0;
for(int i=1;i<=N;i++)
for(int j=0;j<=R;j++)
{
if(j>=P[i].w)
dp[i][j]=min(dp[i-1][j],dp[i][j-P[i].w]+P[i].p);
else
dp[i][j]=dp[i-1][j];
}
if(dp[N][R]==INF)printf("This is impossible.\n");
else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[N][R]);
}
return 0;
}
方法二:内存空间开销小
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 0X3F3F3F3F
int T,E,F,R,N,dp[10005];
struct Pt{
int p;
int w;
}P[505];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&E,&F);
R=F-E;
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d%d",&P[i].p,&P[i].w);
memset(dp,INF,sizeof(dp));
dp[0]=0;
for(int i=1;i<=N;i++)
for(int j=P[i].w;j<=R;j++) //与0-1背包的区别。因为同一种物品数量可以拥有多个。
{
dp[j]=min(dp[j],dp[j-P[i].w]+P[i].p);
}
if(dp[R]==INF)printf("This is impossible.\n");
else printf("The minimum amount of money in the piggy-bank is %d.\n",dp[R]);
}
return 0;
}