==================================
题目大意,给你空小猪储钱罐的重量和装满小猪储钱罐的重量
还有给你硬币的价值和重量,让你估计储钱罐里最少会有多少价值的钱
这道题因为硬币个数不为1,所谓我们考虑使用完全背包
这时候我们就要分析动态方程,要求的最小的价值,那么很好理解,使用min函数,使dp储存的是价值最小值。
此时我们需要将dp数组初始化为最大值,并且dp[0]=0,表示什么都不能放进去。
然后我们考虑如何更新dp数组。
dp保留的是最小值,那么数组下标则要表示的是重量问题。
所以可以这样列动态方程:dp[i]=min(dp[i],dp[i-weight]+value);
接下来就很简单了:
AC代码如下:
#include<iostream>
#include<stdio.h>
using namespace std;
#define INF 100000000
int dp[50010];
int value[50010],weight[50010];
int V,num;
int E,F;
int min(int a,int b)
{
if(a>b)
return b;
else
return a;
}
void CompletePack(int value,int weight)
{
int i;
for(i=weight;i<=V;i++)
dp[i]=min(dp[i],dp[i-weight]+value);
}
int main()
{
int Case;
scanf("%d",&Case);
while(Case--)
{
int i;
scanf("%d %d",&E,&F);
scanf("%d",&num);
V=F-E;
for(i=1;i<=num;i++)
scanf("%d %d",&value[i],&weight[i]);
for(i=1;i<=V;i++)
dp[i]=INF;
dp[0]=0;
for(i=1;i<=num;i++)
CompletePack(value[i],weight[i]);
if(dp[V]>=INF)
printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[V]);
}
return 0;
}