撿蘋果(揹包+貪心)

http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=4811 

Description

以前,有個神祕的院子裏面有三種蘋果,每個蘋果的數量是無限的。有一個小姑娘帶了一個大袋子來到院子,她從來沒見過這麼多的蘋果。每種蘋果都有大小以及出售的價格,小姑娘想獲得最大的利潤,但是她不知道怎麼才能做到。於是她來向你尋求幫助,你能告訴她能獲得的最大價值嗎?

Input

第一行一個整數T(T <= 50),表示測試數據的組數。

每組測試數據有四行組成,前三行每行有兩個整數S和P,分別表示每種蘋果的大小(1 <= S <= 100)和價格(1 <= P <= 10000)

第四行有一個整數V(1 <= V <= 100,000,000)表示小姑娘袋子的大小。

Output

每組測試數據輸出組數和小姑娘能得到的最大的價值。

Sample Input
1
1 1
2 1
3 1
6
Sample Output
Case 1: 6

思路:正常用完全揹包會T,所以先用貪心預處理一下,找一個範圍,先用性價比最高的填滿,剩下的再用完全揹包就ok了。

#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long ll;
ll dp[1000010],v[5],w[5];
struct A
{
    int v;
    int w;
    double b;
}a[5];
bool cmp(A p,A q)
{
    return p.b<q.b;
}
int main()
{
    ll T, m, n,c,e=1;
    cin >> T;
    while (T--){
        ll maxx=-1,ss=0;
        for(int i=1;i<=3;i++){
            cin>>a[i].w>>a[i].v;
            a[i].b=(double)a[i].w/a[i].v;
            if(maxx<a[i].w){
                maxx=a[i].w;
            }
            ss+=a[i].w;
        }
        sort(a+1,a+3+1,cmp);//按性價比排序
        cin>>c;
        ll sum=0,p=0;
        if(c>ss*10){//ss*10就是我找的範圍
            p=(int)(c-ss*10)/a[1].w;
            sum=p*a[1].v;
            c-=p*(a[1].w);//剩下的揹包容量C會很小,可以直接用完全揹包了
        }
        memset(dp, 0, sizeof(dp));
        for(int i=1;i<=3;i++){
            for(int j=a[i].w;j<=c;j++){
                dp[j]=max(dp[j],dp[j-a[i].w]+a[i].v);
            }
        }
        printf("Case %lld: %lld\n",e++,dp[c]+sum);
    }
    return 0;
}

 

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