首页 > 代码库 > HDU5887 Herbs Gathering(搜索 剪枝)
HDU5887 Herbs Gathering(搜索 剪枝)
背包问题,由于数据大不容易dp,改为剪枝,先按性价比排序,若剩下的背包空间都以最高性价比选时不会比已找到的最优解更好时则剪枝,即
if(val + (LD)pk[d].val / (LD)pk[d].w * (lim - w) + EPS <= ans){
return;
}
没想到一发过,0ms
#include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<vector> #include<cmath> #include<utility> using namespace std; typedef long long LL; typedef long double LD; const int N = 108, INF = 0x3F3F3F3F, EPS = 0.4; struct data{ LL w, val; bool operator<(const data &tp)const{ return val * tp.w > tp.val * w; } }pk[N]; int n; LL sum[N], sw[N], lim; LL ans; void dfs(int d, LL w, LL val){ if(val > ans){ ans = val; } if(d >= n){ return; } if(val + (LD)pk[d].val / (LD)pk[d].w * (lim - w) + EPS <= ans){ return; } if(w + pk[d].w <= lim){ dfs(d + 1, w + pk[d].w, val + pk[d].val); } dfs(d + 1, w, val); } int main(){ while(~scanf("%d %I64d", &n, &lim)){ for(int i = 0; i < n; i++){ scanf("%I64d %I64d", &pk[i].w, &pk[i].val); } sort(pk, pk + n); ans = 0; sum[n] = 0; sw[n] = 0; dfs(0, 0, 0); printf("%I64d\n", ans); } return 0; }
HDU5887 Herbs Gathering(搜索 剪枝)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。