每种硬币数量不限,所以是完全背包。条件必须在装满的情况下,求最小价值,那么初始化变为装满的情况(背包九讲)和max变为min。如果遍历完物品后满容量的dp值没有被改变则说明这些硬币无法组成这个容量。由于数据10000,所以就不用二维的了。
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long #define fo freopen("in.txt","r",stdin) #define fc fclose(stdin) #define fu0(i,n) for(i=0;i<n;i++) #define fu1(i,n) for(i=1;i<=n;i++) #define fd0(i,n) for(i=n-1;i>=0;i--) #define fd1(i,n) for(i=n;i>0;i--) #define mst(a,b) memset(a,b,sizeof(a)) #define sd(n) scanf("%d",&n) #define sdd(n,m) scanf("%d %d",&n,&m) #define ss(s) scanf("%s",s) #define sddd(n,m,k) scanf("%d %d %d",&n,&m,&k) #define pans() printf("%d\n",ans) #define all(a) a.begin(),a.end() #define sc(c) scanf("%c",&c) #define we(a) while(scanf("%d",&a)!=EOF) const int maxn=200005; const double eps=1e-8; int main() { int T; cin>>T; while(T--) { int e,f,g; cin>>e>>f; g=f-e; int n; cin>>n; int p[505],w[505]; for(int i=0;i<n;i++) { sdd(p[i],w[i]); } int i,j,dp[10000]; memset(dp,inf,sizeof(dp)); dp[0]=0; for(i=0;i<n;i++) { for(j=w[i];j<=g;j++) { dp[j]=min(dp[j],dp[j-w[i]]+p[i]); } } if(dp[g]!=inf) { cout<<"The minimum amount of money in the piggy-bank is "<<dp[g]<<"."<<endl; } else cout<<"This is impossible."<<endl; } return 0; }