HDU 3466 (01背包)
2016-02-02 04:30
225 查看
题目大意:A merchant有n =个商品,每个都有其价格与价值,xiao想用手里的金钱来收获最大的商品价值,但是只有当小明身上的余额大于每件商品,商人规定的数目时,商人才会卖给他。求解获取最大价值的方案;
分析:一开始按照一般的01背包来做,Wa ,之后看了结题报告才懂。需要先对q-p进行排序,以免受后效性的影响。
看个例子m=10,1(5 6 3) 2(2 8 5)当按12顺序选择时,或得的最大价值即为3,而当按照21顺序选择时,或得上午最大价值变为8。所以选择的规则便是:每次都要给下载个状态最大的选择区间。所以要按照
q-p从小到大排序。
分析:一开始按照一般的01背包来做,Wa ,之后看了结题报告才懂。需要先对q-p进行排序,以免受后效性的影响。
看个例子m=10,1(5 6 3) 2(2 8 5)当按12顺序选择时,或得的最大价值即为3,而当按照21顺序选择时,或得上午最大价值变为8。所以选择的规则便是:每次都要给下载个状态最大的选择区间。所以要按照
q-p从小到大排序。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 500+2 int dp ; #define loop(i,k,n) for(i=k;i<=n;i++) #define loop2(i,k,n) for(i=n;i>=k;i--) struct node { int pp,qq; int v; }a ; bool cmp(const node x,const node y){ return x.qq-x.pp<y.qq-y.pp; } int main() { int n,m; while(~scanf("%d%d",&n,&m)){ int i,j; loop(i,1,n) scanf("%d%d%d",&a[i].pp,&a[i].qq,&a[i].v); memset(dp,0,sizeof(dp)); sort(a+1,a+n+1,cmp); loop(i,1,n) loop2(j,a[i].qq,m) dp[j]=max(dp[j],dp[j-a[i].pp]+a[i].v); printf("%d\n",dp[m]); } return 0; }
相关文章推荐
- 【杭电】[2030]汉字统计
- JavaScript 开发进阶:理解 JavaScript 作用域和作用域链
- 一月学习总结
- 《C#入门经典(第五版)》学习笔记
- 使用 jQuery Deferred 和 Promise 创建响应式应用程序
- 【杭电】[2023]求平均成绩
- 终于搞定啦,共享一个jar包用于图片搜索
- JavaScript函数表达式
- HDU 2546
- 详解JavaScript中的函数与闭包
- HDU 2602(01背包)
- jQuery ready函数实现原理
- 前端精选文摘:BFC 神奇背后的原理
- 几个常用EL表达式的用法
- Leetcode - 285.Inorder Successor in BST
- HDU 5615
- ubuntu 安装配置 ftp
- 网站性能优化·前端篇
- codeforces 585A - Gennady the Dentist(模拟)
- JS 一定要放在 Body 的最底部么?聊聊浏览器的渲染机制