这是完全背包的问题,只是这里需要求最小值,并且是需要装满,那么就需要dp[1]---d[v]=无穷大,dp[0]=0;别的都一样了
#include <iostream>
#include <stdio.h>
#include <iomanip>
using namespace std;
const int MAX =10005;
int dp[MAX];
struct point
{
int c,w;
};
int v;
struct point a[505];
void completePack(int cost,int weight)
{
for(int i=cost;i<=v;i++)
{
dp[i]=min(dp[i],dp[i-cost]+weight);
}
}
int main()
{
int e,f,k,ncase;
cin>>ncase;
while(ncase--)
{
cin>>e>>f;
v=f-e;
cin>>k;
for(int i=0;i<MAX;i++)
dp[i]=111111111; //这里初始化无穷大,因为是求最小值
dp[0]=0;
for(int i=1;i<=k;i++)
{
cin>>a[i].w>>a[i].c;
}
for(int i=1;i<=k;i++)
{
completePack(a[i].c,a[i].w);
}
if(dp[v]<11111111)
cout<<"The minimum amount of money in the piggy-bank is "<<dp[v]<<"."<<endl;
else
cout<<"This is impossible."<<endl;
}
return 0;
}