HDU 5887 Herbs Gathering——剪枝

版权声明:欢迎大家转载,转载请注明出处 https://blog.csdn.net/hao_zong_yin/article/details/81987866
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
ll N, V, MAX;
struct Data {
    ll val, vol;
    bool operator < (const Data &atr) const {
        return 1.0*val/vol > 1.0*atr.val/atr.vol;
    }
}data[maxn];
void dfs(int x, ll val, int vol) {
    if (x == N - 1 || vol == 0) { MAX = max(MAX, val); return; }
    if (val + data[x].val*(vol/data[x].vol+1) <= MAX) return;
    dfs(x+1, val, vol);
    if (data[x].vol <= vol) dfs(x+1, val+data[x].val, vol-data[x].vol);
}
int main() {
    while (~scanf("%lld%lld", &N, &V)) {
        for (int i = 1; i <= N; i++) scanf("%lld%lld", &data[i].vol, &data[i].val);
        sort(data+1, data+1+N);
        MAX = 0;
        dfs(1, 0, V);
        printf("%lld\n", MAX);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/81987866