给你一个空的存钱罐的重量,和一个装了一些钱后的存钱罐的重量,然后给你n
个硬币的价值p
和重量w
,保证存钱罐中的硬币的种类都在这n
种硬币中。现在让我们求在给定重量的情况下,存钱罐内硬币的金额最少是多少。
因为每一种硬币的使用数目没有限制,所以我们可以使用完全背包来进行解决。
我们定义dp[i][j]
的含义为在仅可以使用前i
种硬币,并且正好装满背包容量为j
的前提下,硬币的最小金额。
这里我们需要初始化一些初始值,dp[i][0] = 0
这个状态表示在背包容量为0
的前提下,无论使用前多少种硬币,我们都不能放硬币,因而总的金额为0
。其他的状态dp[i][j] = inf
,因为这里的值我们还不知道,并且我们要求最小值,所以我们给不知道的状态赋值一个很大的数,这样在进行状态递推的时候就可以使用min()
这个函数来进行了。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
typedef long long ll;
using namespace std;
const double esp=1e-6;
const int inf=0x3f3f3f3f;
const int MAXN=500+7;
const int MAXV=1e4+7;
int w[MAXN], val[MAXN];
int dp[MAXV];
int e, f, n, t;
int main()
{
cin>>t;
while(t--){
cin>>e>>f;
int V = f - e;
cin>>n;
for(int i=1; i<=n; i++)
cin>>val[i]>>w[i];
for(int i=0; i<=V; i++)
dp[i] = inf;
dp[0] = 0;
for(int i=1; i<=n; i++)
for(int j=w[i]; j<=V; j++)
dp[j] = min(dp[j], dp[j-w[i]] + val[i]);
if(dp[V] < inf)
cout<<"The minimum amount of money in the piggy-bank is "<<dp[V]<<".\n";
else cout<<"This is impossible.\n";
}
return 0;
}
原文:https://www.cnblogs.com/alking1001/p/12581070.html