码迷,mamicode.com
首页 > 其他好文 > 详细

HDU3466 01背包

时间:2014-05-26 00:09:43      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   c   code   java   

  大概意思是给你2个数分别代表物品个数和你带的钱数,每个物品有3个值,p,q,v,分别表示买该物品所花的钱,买该物品最低所带的钱,物品的价值。得出最大的价值。

很明显是01背包。

则状态转移方程为:
for(i=0;i<n;i++)

for(j=m;j>=a[i].q;j--)

dp[j]=max(dp[j],dp[j-a[i].p]+a[i].w).

 

若保证动归方程无后效性,dp[j-a[i].p]一定要比dp[j]先算,j最小为a[i].q,所以需按q-p从小到大排序。

代码如下:

bubuko.com,布布扣
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 struct mem{
 8     int p, q, w;
 9 }a[550];
10 
11 bool cmp(mem a,mem b)
12 {
13     return a.q-a.p<b.q-b.p;
14 }
15 
16 main()
17 {
18     int n, m, dp[5005], i, j, k;
19     while(scanf("%d%d",&n,&m)==2)
20     {
21         for(i=0;i<n;i++)
22     scanf("%d %d %d",&a[i].p,&a[i].q,&a[i].w);
23     sort(a,a+n,cmp);
24     memset(dp,-1,sizeof(dp));
25     for(i=0;i<n;i++)
26     {
27         for(j=m;j>=a[i].q;j--)
28         dp[j]=max(dp[j],dp[j-a[i].p]+a[i].w);
29     }
30     printf("%d\n",dp[m]+1);
31     }
32     
33 }
bubuko.com,布布扣

 

 

HDU3466 01背包,布布扣,bubuko.com

HDU3466 01背包

标签:style   class   blog   c   code   java   

原文地址:http://www.cnblogs.com/qq1012662902/p/3750003.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!