洛谷P1833【櫻花】題解

題目背景

《愛與愁的故事第四彈·plant》第一章。

題目描述

愛與愁大神後院裏種了n棵櫻花樹,每棵都有美學值Ci。愛與愁大神在每天上學前都會來賞花。愛與愁大神可是生物學霸,他懂得如何欣賞櫻花:一種櫻花樹看一遍過,一種櫻花樹最多看Ai遍,一種櫻花樹可以看無數遍。但是看每棵櫻花樹都有一定的時間Ti。愛與愁大神離去上學的時間只剩下一小會兒了。求解看哪幾棵櫻花樹能使美學值最高且愛與愁大神能準時(或提早)去上學。

輸入輸出格式

輸入格式:

 

共n+1行:

第1行:三個數:現在時間Ts(幾點:幾分),去上學的時間Te(幾點:幾分),愛與愁大神院子裏有幾棵櫻花樹n。

第2行~第n+1行:每行三個數:看完第i棵樹的耗費時間Ti,第i棵樹的美學值Ci,看第i棵樹的次數Pi(Pi=0表示無數次,Pi是其他數字表示最多可看的次數Pi)。

 

輸出格式:

 

只有一個整數,表示最大美學值。

 

輸入輸出樣例

輸入樣例#1: 

6:50 7:00 3
2 1 0
3 3 1
4 5 4

輸出樣例#1: 

11

說明

100%數據:Te-Ts ≤ 1000,n ≤ 10000

樣例解釋:賞第一棵櫻花樹一次,賞第三棵櫻花樹2次


題解 P1833 【櫻花】

放一個簡單易懂的僞100分代碼(需開02),不過這題爆讀入優化的樣子

這道題說實話並不難

這裏強調一下幾個地方

首先就是開始輸入的那個時間了

說實話我這麼輸入有些笨拙,因爲好像可以

scanf("%d:%d",&,&) ; 輸入的樣子,但本蒟蒻菜啊,不會用。

for(int i = 1 ; i <= 2 ; i ++)//輸兩遍
    {
        cin >> a >> ch >> b ;//輸入
        pre[t] = a * 60 + b ;//時間
        t ++ ;
    }

這樣的話時間就用pre[2] - pre[1] 求就好了!

然後往下就是一個及其正常的混合揹包:

 

for(int i = 1 ; i <= n ; i ++)//混合揹包
    if(s[i] == 0)//完全揹包
    {
        for(int j = w[i] ; j <= m ; j ++)
        f[j] = max(f[j] , f[j-w[i]] + c[i]) ;
    }
    else//01揹包和多重揹包(因爲01揹包s[i]爲1)
        for(int j = 1 ; j <= s[i] ; j ++)
        for(int k = m ; k >= w[i] ; k --)
        {
            f[k] = max(f[k] , f[k-w[i]] + c[i]) ;
        }

然後再輸出便完結了! 

關注我的洛谷


完整代碼如下:

自認爲簡單明瞭

#include<iostream>

using namespace std ;

int n , m , w[10020] , c[100010] , f[100101] ,s[10500];

int a , b ;
char ch ;

int main()
{
    int pre[10];
    int t=1;
    for(int i = 1 ; i <= 2 ; i ++)//輸兩遍
    {
        cin >> a >> ch >> b ;//輸入
        pre[t] = a * 60 + b ;//時間
        t ++ ;
    }
    m = pre[2] - pre[1] ;//求時間
    cin >> n ;
    for(int i = 1 ; i <= n ; i ++)
    {
        int p ;
        cin >> w[i] >> c[i] >> s[i] ;
     } 
    for(int i = 1 ; i <= n ; i ++)//混合揹包
    if(s[i] == 0)//完全揹包
    {
        for(int j = w[i] ; j <= m ; j ++)
        f[j] = max(f[j] , f[j-w[i]] + c[i]) ;
    }
    else//01揹包和多重揹包(因爲01揹包s[i]爲1)
        for(int j = 1 ; j <= s[i] ; j ++)
        for(int k = m ; k >= w[i] ; k --)
        {
            f[k] = max(f[k] , f[k-w[i]] + c[i]) ;
        }
    cout << f[m] ;
 } 

完結散花!! 

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