博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「HDU 5887」Herbs Gathering (背包)
阅读量:5342 次
发布时间:2019-06-15

本文共 2383 字,大约阅读时间需要 7 分钟。

题意:

 

给定背包容量和n个物品每个的价值和重量,求能装的物品的最大价值。(采药)

附一组自己出的数据,虽然不够刁钻但是查错够用:

5 100

101 200
99 1
1 2
98 20
2 50

 

做法:(详见行内注释)

做法1:

1. 因为dp解法的复杂度为O(V*N),w[i]和v[i]都在10e9,所以不能dp只能dfs

2. 一种按体积排序的做法:

    按照体积由大到小排序,如果后面能取完的就直接取完;

    如果后面一直选择最优策略(能获得的最大价值加上已有的)都不好于现在的答案则break;
    (参考:)

#include
#include
#include
using namespace std;#define maxn 105typedef long long ll;int n,k;long long sw[maxn],sv[maxn];struct node { int w,v; double rate;//物品的性价比}pack[maxn];bool cmp(node x,node y) {
return x.w>y.w;}long long ans=0;void dfs(int pos,int maxx,ll target){ if(pos==n)//尽量取完 { if(maxx>=pack[pos].w)//如果能装下 ans=max(ans,target+pack[pos].v); else//装不下 ans=max(ans,target); return; } if(sw[pos]<=maxx)//还能装 { ans=max(ans,target+sv[pos]); return; } if(target+sv[pos]<=ans) return;//要搜的+搜到的 都不好于现在,不搜 dfs(pos+1,maxx,target); if(maxx>=pack[pos].w) dfs(pos+1,maxx-pack[pos].w,target+pack[pos].v);}int main(){ while(scanf("%d%d",&n,&k)!=EOF) { ans=0; sw[n+1]=0; sv[n+1]=0; for(int i=1;i<=n;i++) { cin>>pack[i].w>>pack[i].v; pack[i].rate = 1.0*pack[i].v/pack[i].w;//计算性价比 } sort(pack+1,pack+n+1,cmp); for(int i=n;i>=1;i--) { sv[i]=sv[i+1]+pack[i].v; sw[i]=sw[i+1]+pack[i].w; } dfs(1,k,0); cout<
<

 

做法2:

1. 先按性价比排序,直接把不能选的去掉,之后搜索的时候若剩下的背包空间都以最高性价比选时不会比已找到的最优解更好时则剪枝

(参考:)

#include
#include
#include
using namespace std;#define maxn 105#define INF 0x3f3f3f3ftypedef long long LL;int n,k;long long cnt,ans;struct node { long long w,v; double r;//物品的性价比}pack[maxn];bool cmp(node x,node y) {
return x.r>y.r;}int check(int i,long long sw,long long sv){ for(int j=i; j
ans;}void dfs(int i,long long sw,long long sv){ ans=max(ans,sv); if(i
>w>>v; if(w<=k) { pack[++cnt].w=w; pack[cnt].v=v; pack[cnt].r=(v+0.0)/w; // pack[cnt++]=(node){w, v, (v+0.0)/w}; } } sort(pack+1,pack+1+cnt,cmp); dfs(0,0,0); cout<
<

 

转载于:https://www.cnblogs.com/LocaEtric/p/9275655.html

你可能感兴趣的文章
XML中CDATA和#PCDATA的区别
查看>>
6)添加一个窗口的图标
查看>>
SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)
查看>>
POJ - 1422 Air Raid 二分图最大匹配
查看>>
Road Map
查看>>
正则替换中的一个Bug
查看>>
HI3531uboot开机画面 分类: arm-linux-Ubunt...
查看>>
制作U盘启动CDLinux 分类: 生活百科 ...
查看>>
leetcode——Best Time to Buy and Sell Stock
查看>>
Android LinearLayout 的几个属性
查看>>
strcpy函数里的小九九
查看>>
搭建ssm过程中遇到的问题集
查看>>
OpenLayers绘制图形
查看>>
tp5集合h5 wap和公众号支付
查看>>
Flutter学习笔记(一)
查看>>
iOS10 国行iPhone联网权限问题处理
查看>>
洛谷 P1991 无线通讯网
查看>>
[HIHO1184]连通性二·边的双连通分量(双连通分量)
查看>>
Codeforces Round #178 (Div. 2) B. Shaass and Bookshelf 【动态规划】0-1背包
查看>>
SparkStreaming 源码分析
查看>>