The minimum amount of money in the piggy-bank is 60. The minimum amount of money in the piggy-bank is 100. This is impossible.
题目大意:对于一个储钱猪,你不知道里面有多少钱,你只能通过猪的体重和相应硬币的重量来进行估算,让你输出这个猪里面的钱最少是多少。
思路分析:稍加思考就知道这是一个背包问题,同时题目并没有限制每一种硬币的数目,即所有硬币都是无穷多的,因此应该套用完全背包模板,但是在
初始化的时候要注意,因为猪的重量是明确给出的,即背包必须要恰好装满,同时区别于模板背包问题,这相当于是让你输出最少价值,f[0]=0,其他初始化为正无穷
所以在状态转移的时候把max,变成min即可,1A而过。
代码:
#include <iostream>
#include <stack>
#include <cstdio>
#include <cstring>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn1=10000+100;
const int maxn2=500+50;
int f[maxn1];
int v[maxn2],w[maxn2];
const int inf=99999999;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int E,F,V,N;
scanf("%d%d",&E,&F);
scanf("%d",&N);
V=F-E;
for(int i=1;i<=N;i++)
scanf("%d%d",&v[i],&w[i]);
f[0]=0;
for(int i=1;i<=V;i++)
f[i]=inf;
for(int i=1;i<=N;i++)
{
for(int j=w[i];j<=V;j++)
{
f[j]=min(f[j],f[j-w[i]]+v[i]);
}
}
if(f[V]<inf)
printf("The minimum amount of money in the piggy-bank is %d.\n",f[V]);
else printf("This is impossible.\n");
}
}