2011-06-10 20:44:41Morris

d645. 輪下亡魂

http://zerojudge.tw/ShowProblem?problemid=d645

內容 :

路過的鴨上次在你的幫忙之後,
成功解決鴨子王(duckingod)的難題而復活了!

但是有一天牠過馬路的時候…
牠因為闖紅燈結果被車撞死了囧
(…那有什麼辦法,鴨子又看不懂紅綠燈)

無奈的duckingod決定再給路過的鴨一次機會!
但是這次的題目比上次更難!
同樣是鴨飼料問題,限定的體積要吃得最飽,
但是現在除了普通的鴨飼料(只能吃一次)之外多了另外兩種神奇的飼料!
1.神的鴨飼料!不管被吃幾次都不會消失(吃到飽?)
2.分身鴨飼料!在一定次數內被吃幾次都不會消失

輸入說明 :

每個測資點僅一組測資。
第一行有兩個正整數i,c代表飼料種類數、鴨子胃的容量,(1<=i<=1000 , 1<=c<=1000)
接下來i行每一行的飼料資料有三個正整數v,w,t,(1<=v<=10000,1<=w<=c,-1<=t<=100)
v是該飼料的飽足感、w是體積、t則代表飼料的類型:
t=-1表示是神的鴨飼料!
t=1表示是普通鴨飼料!
t>1表示是分身鴨飼料,可以被吃t次

輸出說明 :

請輸出路過的鴨能取得的最大飽足感。
(答案保證不超過1000000000)

範例輸入 :

7 100
2 4 -1
1 3 -1
60 10 1
40 10 1
10 10 3
5 6 7
6 5 2

範例輸出 :

174

提示 :

 共計三個測資點,配分30%、35%、35%

 

出處 :

jack1 (管理:jack1)

作法 : DP
兩種DP問題混搭,零錢問題 & 0/1背包問題


/**********************************************************************************/
/*  Problem: d645 "輪下亡魂" from jack1                                       */
/*  Language: C                                                                   */
/*  Result: AC (8ms, 272KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-06 09:36:10                                     */
/**********************************************************************************/


#include<stdio.h>
main() {
    int I, C, a, b, c;
    while(scanf("%d %d", &I, &C) == 2) {
        int v, w, t;
        int DP[1001] = {};
        while(I--) {
            scanf("%d %d %d", &v, &w, &t);
            if(t == -1) {
                for(a = w; a <= C; a++) {
                    if(DP[a] < DP[a-w] + v)
                        DP[a] = DP[a-w] + v;
                }
            }
            else {
                while(t) {
                    for(a = C - w; a >= 0; a--)
                        if(DP[a+w] < DP[a] + v)
                            DP[a+w] = DP[a] + v;
                    t--;
                }
            }
        }
        printf("%d\n", DP[C]);
    }
    return 0;
}