题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114
思路:动态规划之完全背包的题目
题目大意是给出了钱罐的初始重量和装满钱的重量,,然后给你N种硬币,每种硬币有对应的价值和重量,求出使钱罐装满的最小价值。
注意:要求的是最小值,且要求把背包装满,所以初始化的时候对0个物品,当背包容量为0时装满0的价值最小是0,当背包容量为其他值是是非法状态,因为题目要求的是最小值,所以把其他状态赋值成最大值。注意此时赋值的最大值应该是相对最大值,如果赋值成机内最大值的化,对状态转移方程dp[j]=min(dp[j],dp[j-w[i]]+p[i])时dp[j-w[i]]+p[i]会超出int的表示范围,可能会影响到最终结果,所以最好是赋值成相对最大值。(推荐使用memset(a,0x3f,sizeof(a)),避免相加会溢出)。
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <cstring>
#include <map>
#include <set>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
int dp[10010];
int main(){
int T,E,F,N,p[600],w[600];
scanf("%d",&T);
while(T--){
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
scanf("%d%d",&E,&F);
scanf("%d",&N);
for(int i=0;i<N;i++)
scanf("%d%d",&p[i],&w[i]);
for(int i=0;i<N;i++){
for(int j=w[i];j<=F-E;j++)
dp[j]=min(dp[j],dp[j-w[i]]+p[i]);
}
if(dp[F-E]!=dp[10009])
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[F-E]);
else
printf("This is impossible.\n");
}
return 0;
}