题目:
链接:点击打开链接
题意:
知道存钱罐的质量和装满硬币的存钱罐的质量,然后是不同硬币的价值和质量,求出存钱罐里钱币的最小价值。
算法:
完全背包问题,银币的个数是不限的。
思路:
状态转移方程:j = 0时,价值为0
dp[j] = min(dp[j],dp[j-w[i]]+v[i]);//表示质量为j的钱币,含有的最小的价值
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 10000000
int dp[10010],w[555],v[555];
int e,f;
int main()
{
//freopen("input.txt","r",stdin);
int t,coinw,n;
cin>>t;
while(t--)
{
cin>>e>>f;
coinw = f-e;
cin>>n;
for(int i=0; i<=coinw; i++)
dp[i] = INF;
dp[0] = 0;
for(int i=0; i<n; i++)
{
cin>>v[i]>>w[i];
}
for(int i=0; i<n; i++)
{
for(int j=w[i]; j<=coinw; j++)
{
dp[j] = min(dp[j],dp[j-w[i]]+v[i]);
}
}
if(dp[coinw] == INF)
printf("This is impossible.\n");
else
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[coinw]);
}
return 0;
}