完全背包问题
dp[j]=min(dp[j-w[i]]+p[i],dp[j]);
dp[j-w[i]]+p[i]表示放进重量为w[i],价值为p[i]的物品,dp[j]表示不放此物品。
#include <iostream>
#include <cstdio>
#define INF 0x6fffffff
#define min(a,b) a<b?a:b;
using namespace std;
int dp[10005];
int main()
{
int empty,fill,maxw;
int n,i,j;
int t;
scanf("%d",&t);
while(t--)
{
int p[1005],w[1005];
scanf("%d%d",&empty,&fill);
maxw=fill-empty;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&p[i],&w[i]);
}
for(i=0;i<=maxw;i++)
{
dp[i]=INF;
}
dp[0]=0;
for(i=0;i<n;i++)
{
for(j=w[i];j<=maxw;j++)
{
dp[j]=min(dp[j-w[i]]+p[i],dp[j]);
// cout<<dp[j]<<' ';
}
// cout<<endl;
}
if(dp[maxw]<INF)
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[maxw]);
else printf("This is impossible.\n");
}
return 0;
}