比较裸的完全背包都可以套模板,数据量小直接AC
TLE了就改就地滚动+优化,此题就属于数据量相对较大
#include<iostream>
#include <string>
#include<vector>
#include<algorithm>
#include<set>
#include<fstream>
#include<cmath>
#include<queue>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define FORE(i,b,e) for(int i=b;i>=e;i--)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =10005;
const int INF = 25000005;
int tol,n,m;
int dp[maxnum];
int w[505],c[505];
int main()
{
//fstream fin("G:/1.txt");
int t;
cin>>t;
//fin>>t;
while(t--){
scanf("%d%d%d",&m,&tol,&n);
//fin>>m>>tol>>n;
tol-=m;
ms(w);ms(c);
FOR(i,1,n){
scanf("%d%d",&w[i],&c[i]);
//fin>>w[i]>>c[i];
}
dp[0]=0;
FOR(i,1,tol) dp[i]=INF;
FOR(i,1,n){
FOR(j,c[i],tol){
dp[j]=min(dp[j],dp[j-c[i]]+w[i]);
}
}
if(dp[tol]==INF)printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[tol]);
}
return 0;
}