【HDOJ】3466 Proud Merchants

本文介绍了一种解决01背包问题的方法,首先对物品进行特定排序预处理,然后运用01背包动态规划算法求解最大价值。通过C语言代码实现了这一过程,并详细展示了从输入物品信息到最终输出最大价值的全过程。

先排序预处理,后01背包。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 
 5 #define MAX(a, b) (a>b) ? a:b
 6 
 7 int dp[5000];
 8 
 9 typedef struct {
10     int p, q, v;
11 } stuff_st;
12 
13 stuff_st stuffs[505];
14 
15 int comp(const void *a, const void *b) {
16     stuff_st *p = (stuff_st *)a;
17     stuff_st *q = (stuff_st *)b;
18 
19     return (p->q-p->p) - (q->q-q->p);
20 }
21 
22 int main() {
23     int n, m;
24     int i, j;
25 
26     while (scanf("%d %d", &n, &m) != EOF) {
27         for (i=1; i<=n; ++i) {
28             scanf("%d%d%d", &stuffs[i].p, &stuffs[i].q, &stuffs[i].v);
29         }
30         memset(dp, 0, sizeof(dp));
31         qsort(stuffs+1, n, sizeof(stuff_st), comp);
32         for (i=1; i<=n; ++i) {
33             for (j=m; j>=stuffs[i].q; --j) {
34                 dp[j] = MAX(dp[j], dp[j-stuffs[i].p]+stuffs[i].v);
35             }
36             /*
37             for (j=0; j<=m; ++j) {
38                 printf("%d ", dp[j]);
39             }
40             printf("\n");
41             */
42         }
43         printf("%d\n", dp[m]);
44     }
45 
46     return 0;
47 }

 

转载于:https://www.cnblogs.com/bombe1013/p/3756586.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值