//62ms 1464kB#include<iostream>#include<algorithm>#include<cstring>#define INF 0x3f3f3f3f
using namespace std;constint maxn =1e4+5;int E,F,W;int N;int v[505], w[505];int dp[maxn];voidINIT(){memset(dp , INF ,sizeof(dp));return;}intmain(){int T;cin>>T;while(T--){INIT();
cin>>E>>F;
W = F - E;
cin>>N;for(int i=1;i<=N;i++)scanf("%d%d", v + i , w + i);
dp[0]=0;for(int i=1;i<=N;i++)for(int j=w[i];j<=W;j++)
dp[j]=min(dp[j], dp[j - w[i]]+ v[i]);if(dp[W]== INF)
cout<<"This is impossible."<<endl;elseprintf("The minimum amount of money in the piggy-bank is %d.\n", dp[W]);}return0;}
二刷:
其实是3 or 4刷了……
//78ms 1448kB#include<iostream>#include<algorithm>#include<cstring>#define INF 0x3f3f3f3f
using namespace std;constint maxn =1e4+5;int T,E,F,W,N;int p[505], w[505];int dp[maxn];intmain(){
cin>>T;while(T--){memset(dp , INF ,sizeof(dp));
cin>>E>>F;
W = F - E;
cin>>N;for(int i=1;i<=N;i++)
cin>>p[i]>>w[i];
dp[0]=0;for(int i=1;i<=N;i++)for(int j=w[i];j<=W;j++)
dp[j]=min(dp[j], dp[j-w[i]]+ p[i]);if(dp[W]!= INF)printf("The minimum amount of money in the piggy-bank is %d.\n", dp[W]);elseprintf("This is impossible.\n");}return0;}