zoukankan      html  css  js  c++  java
  • HDU 1114 完全背包

    HDU 1114 完全背包

    题意

    给你一个空的存钱罐的重量,和一个装了一些钱后的存钱罐的重量,然后给你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]<<".
    ";
    		else cout<<"This is impossible.
    ";
    	}
    	return 0;
    }
    
  • 相关阅读:
    ASP.NET调用word开发环境下正常,iis下报错
    关于CSS的两本书的感觉
    蓝牙模块在HHARM2410上的移植
    关于Activity和Task的设计思路和方法
    用蓝牙连接debian和诺基亚手机
    15.2 连接蓝牙设备
    蓝芽:Linux与手机(at,ftp)
    UBUTUN 通过蓝牙连接Hoary和诺基亚手机
    php class类用法总结 Leone
    提高PHP编程效率的53个要点 Leone
  • 原文地址:https://www.cnblogs.com/alking1001/p/12581070.html
Copyright © 2011-2022 走看看