zoukankan      html  css  js  c++  java
  • HDU 3466 Proud Merchants 带有限制的01背包问题

    HDU 3466 Proud Merchants 带有限制的01背包问题

    题意

    最近,伊萨去了一个古老的国家。在这么长的时间里,它是世界上最富有、最强大的王国。因此,即使他们的国家不再那么富有,这个国家的人民仍然非常自豪。

    商人是最典型的,他们每一个只卖了一个项目,价格是PI,但他们拒绝与你交易如果你的钱低于QI,ISEA评估每一个项目的价值VI。

    如果他有M单位的钱,伊萨能得到的最大价值是多少?

    解题思路

    p代表需要的价钱,q代表买这个物品的门槛。

    思路就是先尝试买qi-pi大的商品,即按照qi-pi从大到小排序,但实际编码过程中需要从小到大排序。为什么呢?考虑在求dp(i, j)时,dp(i, j) = max(dp(i-1,j), dp(i-1, j-p[i]) + v[i]),仔细分析下dp(i-1, j-p[i]) + v[i] 这种情况,发现其实是先买了第i种商品,就是说排在后面的商品其实是先买的。

    这里的重点是分析dp(i-1, j-q[i]) + v[i],为什么是先买的第i件物品?我们可以这样理解:dp(i-1, j-q[i])可以理解为先买了第i件物品后,买其他物品的最大价值。这个理解转变我一开始很难理解。

    #include<cstdio>
    #include<algorithm>
    
    using namespace std;
    
    const int N=600;
    const int M=6e3+7;
    struct note{
    	int p, limit, v;
    	bool operator < (note a) const 
    	{
    		return limit-p < a.limit-a.p;
    	}
    }num[N];
    
    int dp[M];
    int main()
    {
    	int n, m;
    	scanf("%d%d", &n, &m);
    	for(int i=0; i<n; i++)
    	{
    		scanf("%d%d%d", &num[i].p, &num[i].limit, &num[i].v);	
    	}	
    	sort(num, num+n);
    	for(int i=0; i<n; i++)
    	for(int j=m; j>=num[i].p && j>=num[i].limit; j--)
    		dp[j]=max(dp[j], dp[j-num[i].p]+num[i].v);
    	printf("%d
    ", dp[m]);
    	return 0;	
    }
    
    欢迎评论交流!
  • 相关阅读:
    HTML DOM 06 节点关系
    HTML DOM 05 事件(三)
    HTML DOM 05 事件(二)
    HTML DOM 05 事件(一)
    html DOM 04 样式
    html DOM 03 节点的属性
    html DOM 02 获取节点
    html DOM 01 节点概念
    JavaScript 29 计时器
    JavaScript 28 弹出框
  • 原文地址:https://www.cnblogs.com/alking1001/p/11566999.html
Copyright © 2011-2022 走看看