SDUT2408 Pick apples(贪心+完全背包)

题目链接

分析:

贪心不能解决背包问题在于,它无法保证能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。

因此可以大范围用贪心,小范围用背包。

注意:

提交过程中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;
}

 

 

posted on 2013-04-20 16:23  Still_Raining  阅读(322)  评论(0编辑  收藏  举报