題目背景
《愛與愁的故事第四彈·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] ;
}
完結散花!!