uva 12325

来源:互联网 发布:java初级工程师简历 编辑:程序博客网 时间:2024/06/05 11:00

乍一看题目像是dp,然而数据量很大

题意是给你两种物品 价值V1,V2  大小S1,S2 让你用一个大小是C的背包去装 

性价比高的物品肯定要优先装入,问题是s1和s2可能都很小,导致枚举数量极大

可以有另一种枚举法,s2个物1和s1个物2,体积相等,价值为s2*v1 s1*v2 按照性价比的思路就可以了

#include <bits/stdc++.h>using namespace std;typedef long long LL;int main(int argc, char const *argv[]){int kase = 0;cin >> kase;for (int T = 1; T <= kase; T++){int n, s1, v1, s2, v2;cin >> n >> s1 >> v1 >> s2 >> v2;if (s1 > s2){swap(s1, s2);swap(v1, v2);}LL ans = 0;if (n / s2 >= 65536){for (LL i = 0; i <= s1; i++)ans = max(ans, v2 * i + (n - s2 * i) / s1 * v1);for (LL i = 0; i <= s2; i++)ans = max(ans, v1 * i + (n - s1 * i) / s2 * v2);}else{for (LL i = 0; s2 * i <= n; i++)ans = max(ans, v2 * i + (n - s2 * i) / s1 * v1);}cout << "Case #" << T << ": " << ans << endl;}return 0;}

0 0
原创粉丝点击