看到完全背包写了一下。
一遍wa,仔细看了看ac的代码,原来数值设定小了。
完全背包的小变形,用来求填充存钱罐最小的费用,把max给改成min,还有要小心一下,cpack里面的写法。
#include <iostream>
#define size 1000000000
using namespace std;
struct pack
{
int w,c;
};
pack p[501];
int f[10010];
int v;
void cpack(pack p)
{
for(int i=p.w;i<=v;i++)
f[i]=min(f[i],f[i-p.w]+p.c); //这里i减的是开销,要适当调整
}
int main()
{
int t,a,b,n;
cin>>t;
while(t--)
{
cin>>a>>b;
v=b-a;
cin>>n;
for(int i=1;i<=n;i++)
cin>>p[i].c>>p[i].w;
for(int i=0;i<=v;i++) f[i]=size;
f[0]=0; //注意这里!!! 01背包不用写
for(int i=1;i<=n;i++)
cpack(p[i]);
if(f[v]==size) cout<<"This is impossible."<<endl;
else cout<<"The minimum amount of money in the piggy-bank is "
<<f[v]<<"."<<endl;
}
return 0;
}