DHU 1114 Piggy-Bank (完全背包,变式)

来源:互联网 发布:网络作战发展战略 编辑:程序博客网 时间:2024/05/09 18:00
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 
 
==================================
 
题目大意,给你空小猪储钱罐的重量和装满小猪储钱罐的重量
还有给你硬币的价值和重量,让你估计储钱罐里最少会有多少价值的钱
这道题因为硬币个数不为1,所谓我们考虑使用完全背包
 
这时候我们就要分析动态方程,要求的最小的价值,那么很好理解,使用min函数,使dp储存的是价值最小值。
此时我们需要将dp数组初始化为最大值,并且dp[0]=0,表示什么都不能放进去。
然后我们考虑如何更新dp数组。
dp保留的是最小值,那么数组下标则要表示的是重量问题。
所以可以这样列动态方程:dp[i]=min(dp[i],dp[i-weight]+value);
 
接下来就很简单了:
 
AC代码如下:
 
#include<iostream>#include<stdio.h>using namespace std;#define INF 100000000int dp[50010];int value[50010],weight[50010];int V,num;int E,F;int min(int a,int b){if(a>b)return b;elsereturn a;}void CompletePack(int value,int weight){int i;for(i=weight;i<=V;i++)dp[i]=min(dp[i],dp[i-weight]+value);}int main(){int Case;scanf("%d",&Case);while(Case--){int i;scanf("%d %d",&E,&F);scanf("%d",&num);V=F-E;for(i=1;i<=num;i++)scanf("%d %d",&value[i],&weight[i]);for(i=1;i<=V;i++)dp[i]=INF;dp[0]=0;for(i=1;i<=num;i++)CompletePack(value[i],weight[i]);if(dp[V]>=INF)printf("This is impossible.\n");elseprintf("The minimum amount of money in the piggy-bank is %d.\n",dp[V]);}return 0;}

 
 
原创粉丝点击