解法
完全装满背包
求最小值那么把所有的dp设置成inf(要完全装满),且转移方程写min,原点设置为0,然后套完全背包就可以了
能不能完全装满的检测就是看dp[m]有没有更新,更新了那么就是能完全装满否则完全装不满
代码
#include <bits/stdc++.h>
using namespace std;
int dp[1000005],v[1000],w[1000];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
int m1,m2;
cin>>m1>>m2;
int m=m2-m1;
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>w[i]>>v[i];
fill(dp,dp+1000005,999999999);
dp[0]=0;
for(int i=0;i<n;i++)
for(int j=v[i];j<=m;j++)
dp[j]=min(dp[j],dp[j-v[i]]+w[i]);
if(dp[m]==999999999)
cout<<"This is impossible.
";
else
cout<<"The minimum amount of money in the piggy-bank is "<<dp[m]<<".
";
}
}