完全背包
对每个银币进行完全背包
#include<bits/stdc++.h>
using namespace std;
int w[100010];
int v[100010];
int dp[100010];
const int inf = 0x3f3f3f3f;
void completepack(int v,int w,int sum)
{
int i;
for(i=0;i<=sum;i++)
{
if(i>=w)
{
dp[i] = min(dp[i],dp[i-w]+v);
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int k;
int i,j;
cin>>k;
int sum = m-n;
for(i=1;i<=sum;i++)
dp[i]=inf;
dp[0]=0;
for(i=1;i<=k;i++)
{
cin>>w[i]>>v[i];
}
for(i=1;i<=k;i++)
{
completepack(w[i],v[i],sum);
}
if(dp[sum]==inf)
cout<<"This is impossible."<<endl;
else
cout<<"The minimum amount of money in the piggy-bank is "<<dp[sum]<<"."<<endl;
}
}