完全背包即物品的数量不收限制,
根据01背包的思想,因为每件物品只能选1个,则要求我们不能依赖已选择物品i的选项的时候,所以需要逆序遍历
则在完全背包问题中,我们需要正序遍历。
此题时要求求出最小价值。
代码如下:
#include <stdio.h>
#include <algorithm>
using namespace std;
#define inf 10000000
#define min(a,b) a<b?a:b
int dp[];
int p[];
int w[]; int main()
{
int i,j,k,n,e,f;
scanf("%d",&k);
while(k--)
{
scanf("%d",&e);
scanf("%d",&f);
int diff = f - e;
scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("%d",&p[i]);
scanf("%d",&w[i]);
}
//memset(dp,inf,sizeof(dp));//不可以这样初始化
for(int i=;i<=diff;i++)
{
dp[i]=inf;
}
dp[] = ;
for(i=;i<=n;i++)
{
for(j=w[i];j<=diff;j++)
{
dp[j] = min(dp[j],dp[j-w[i]]+p[i]);
}
}
if(dp[diff] == inf){printf("This is impossible.\n");}
else
{
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[diff]);
}
}
system("pause");
return ;
}