hdu 3466 Proud Merchants

 

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3466

这是一道01背包的变形题,题目增加了一个限制条件,即当你所拥有的钱数大于某个限定值时才可以购买该物品。

按照q - p以由大到小的顺序排序,然后进行01背包的DP即可。

 

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
1 #include < iostream >
2 #include < algorithm >
3   using namespace std;
4
5   const int M = 5005 ;
6 struct Goods
7 {
8 int p, q, v;
9 }merchants[M];
10
11
12 int cmp(Goods a, Goods b)
13 {
14 return (a.q - a.p) < (b.q - b.p);
15 }
16
17 int main()
18 {
19 int n, m;
20 while (scanf( " %d%d " , & n, & m) != EOF)
21 {
22 int dp[M] = { 0 };
23 for ( int i = 0 ; i < n; i ++ )
24 scanf( " %d%d%d " , & merchants[i].p, & merchants[i].q, & merchants[i].v);
25
26 sort(merchants, merchants + n, cmp);
27 int res = m;
28 for ( int i = 0 ; i < n; i ++ )
29 {
30 for ( int j = m; j >= max(merchants[i].p,merchants[i].q); j -- )
31 {
32
33 if (dp[j] < (dp[j - merchants[i].p] + merchants[i].v))
34 {
35 dp[j] = dp[j - merchants[i].p] + merchants[i].v;
36 }
37
38 }
39 }
40 int ans = - 1 ;
41 for ( int i = 0 ; i <= m; i ++ )
42 if (ans < dp[i]) ans = dp[i];
43 printf( " %d\n " ,dp[m]);
44 }
45 return 0 ;
46 }
47

 

转载于:https://www.cnblogs.com/zhjjla/archive/2010/09/06/1819569.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值