题目链接。
分析:
贪心不能解决背包问题在于,它无法保证能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。
因此可以大范围用贪心,小范围用背包。
注意:
提交过程中WA了很多次,原因已查明, WA时用的int p, v;而AC用的是long long p, v; 题目中已明确给出数据范围,按理说int是可以的,不明白为什么会WA
AC代码如下:
#include <iostream> #include <vector> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> using namespace std; const int maxn = 10000; struct num{ long long p, v; double val; }a[3]; long long dp[maxn+1000]; bool cmp(const num &a, const num &b){ return a.val > b.val; } int main(){ int T, n, m; long long s; scanf("%d", &T); for(int nCase=1; nCase<=T; nCase++){ s = 0; for(int i=0; i<3; i++){ scanf("%lld %lld", &a[i].v, &a[i].p); a[i].val = (double)a[i].p/a[i].v; } memset(dp, 0, sizeof(dp)); scanf("%d", &m); if(m > maxn){ sort(a, a+3, cmp); n = floor((double)(m-maxn+100)/a[0].v)+1; s = n*a[0].p; m -= n*a[0].v; } for(int i=0; i<3; i++){ for(int j=a[i].v; j<=m; j++){ dp[j] = max(dp[j], dp[j-a[i].v]+a[i].p); } } printf("Case %d: %lld\n", nCase, s+dp[m]); } return 0; }