本文主要是介绍hdu1114Piggy-Bank(DP完全背包),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:在ACM可以做任何事情,必须准备和预算获得必要的财政支持。这次行动的主要收入来自不可逆绑定金钱(IBM)。背后的想法很简单。每当一些ACM成员有任何小的钱,他把所有的硬币和成小猪银行抛出。你知道,这个过程是不可逆的,不能被删除的硬币没有打破猪。足够长的时间后,应该有足够的现金在小猪银行支付,需要支付的一切,但有一个很大的问题,小猪银行。这是不可能的,以确定多少钱,里面是。因此,我们可能会破坏猪成片,才发现没有足够的钱。显然,我们要避免这种不愉快的情况。唯一的可能性是衡量小猪银行,并尝试猜里面有多少硬币。假设我们能够准确,我们知道所有硬币给定货币的权重确定权重的猪。再有就是一些最低金额在小猪银行的钱,我们可以保证。你的任务是要找出这种最坏的情况下,里面的小猪银行确定的最低数额的现金。我们需要你的帮助。没有更多的过早破裂的猪!
最优解法—O(VN)
#include<stdio.h>
#include<cstring>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define MAX 10005
#define IFN 1000000
int dp[MAX];
int p[505],w[505];
int min(int x,int y)
{return(x>y?y:x);
}
int main()
{//freopen("input.txt","r",stdin);int e,v;int i,j,t;scanf("%d",&t);while(t--){scanf("%d%d",&e,&v);dp[0]=0;//注意dp[0]要赋值为0;for(i=1;i<=v;i++)dp[i]=IFN;//因要求最小值,所以其他都要赋值初始化为最大数v-=e;int n;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d%d",&p[i],&w[i]);for(i=0;i<n;i++)for(j=w[i];j<=v;j++){dp[j]=min(dp[j],dp[j-w[i]]+p[i]);}if(dp[v]==IFN)printf("This is impossible.\n");//若不能恰好装满,则dp[v]就没有被改变elseprintf("The minimum amount of money in the piggy-bank is %d.\n",dp[v]);/*dp[v]即为恰好装满的最大值*/}return 0;
}
这篇关于hdu1114Piggy-Bank(DP完全背包)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!