SDUT 3903

一個零一揹包

關鍵是如何去排序

我們的目的是經可能多的得分,所以要用貪心策略去排序

貪心的方向是,讓掉分速度最快的題儘早做,原因是他分數掉的最快,做的越晚收益越低

所以這裏的貪心就類似高中的加速度 △v/△t

按照排序找出來思考過程中代價最大的題目,先做它就可以了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 5000 + 10;
struct problem{
    int v;///value
    int d;///
    int c;///
}pro[maxn];
bool cmp(problem a, problem b){
    double x = double(a.d)/double(a.c);
    double y = double(b.d)/double(b.c);
    return x > y;///類似於加速度,讓下落速度最快的題先做
}
int d[maxn];
int main(){
    int n, T;
    while(scanf("%d%d", &n, &T) != EOF){
        memset(d, 0, sizeof(d));
        for(int i = 1; i <= n; i++){
            scanf("%d", &pro[i].v);
        }
        for(int i = 1; i <= n; i++){
            scanf("%d", &pro[i].d);
        }
        for(int i = 1; i <= n; i++){
            scanf("%d", &pro[i].c);
        }
        sort(pro + 1, pro + n + 1, cmp);
        int ans = 0;
        for(int i = 1; i <= n; i++){
           // printf("i = %d, v = %d, d = %d, c = %d\n", i, pro[i].v, pro[i].d, pro[i].c);
            for(int j = T; j - pro[i].c >= 0; j--){
                int tmp = j - pro[i].c;
                d[j] = max(d[j], d[tmp] + pro[i].v - j*pro[i].d);
               // printf("d[%d] = %d\n", j, d[j]);
                ans = max(ans, d[j]);
            }
        }
        printf("%d\n", ans);
    }

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章