题目大意: 知道一个储钱罐的原始重量和装了硬币后的重量,再给 n 种硬币的 价值 和 重量,求这个储钱罐中硬币的最小价值。
解题思路: 完全背包。 状态转移方程 : dp[j] = min( dp[ j ] , dp[ j - weight[ i ] ] + value[ i ] )
初始化的时候 dp[ 0 ] = 0;
#include <iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int inf=99999999;
int dp[11000],weight[550],value[550];
int main()
{
int t,n,w1,w2,w,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&w1,&w2);
w=w2-w1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&value[i],&weight[i]);
}
for(i=0;i<=w;i++)
{
dp[i]=inf;
}
dp[0]=0;// 这个是重点。
for(i=1;i<=n;i++)
{
for(j=weight[i];j<=w;j++)
{
dp[j]=min(dp[j],dp[j-weight[i]]+value[i]);
}
}
if(dp[w]==inf)
printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[w]);
}
return 0;
}