《愛與愁的故事第四彈·plant》第一章。c++
愛與愁大神後院裏種了n棵櫻花樹,每棵都有美學值Ci。愛與愁大神在天天上學前都會來賞花。愛與愁大神但是生物學霸,他懂得如何欣賞櫻花:一種櫻花樹看一遍過,一種櫻花樹最多看Ai遍,一種櫻花樹能夠看無數遍。可是看每棵櫻花樹都有必定的時間Ti。愛與愁大神離去上學的時間只剩下一小會兒了。求解看哪幾棵櫻花樹能使美學值最高且愛與愁大神能準時(或提前)去上學。優化
共n+1行:spa
第1行:三個數:如今時間Ts(幾點:幾分),去上學的時間Te(幾點:幾分),愛與愁大神院子裏有幾棵櫻花樹n。code
第2行~第n+1行:每行三個數:看完第i棵樹的耗費時間Ti,第i棵樹的美學值Ci,看第i棵樹的次數Pi(Pi=0表示無數次,Pi是其餘數字表示最多可看的次數Pi)。blog
只有一個整數,表示最大美學值。ci
6:50 7:00 3 2 1 0 3 3 1 4 5 4
11
咳咳,這是一道典型的混合揹包,對於混合揹包呢,咱們只須要作個判斷,而後分別裝包就好了啦......還有一個就是時間的讀入,記得轉換哦string
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int t[10005],v[10005],p[10005]; 5 int dp[100005]; 6 int T()//時間轉換(有點麻煩,因此我以後給你們介紹更簡單的) 7 { 8 int sum=0; 9 int S=0,E=0,ss=0,ee=0; 10 bool flag=true; 11 string s,e; 12 cin>>s>>e; 13 for(int i=0;i<s.size();i++) 14 { 15 if(s[i]!=':'&&flag) 16 { 17 S=S*10+(s[i]-'0'); 18 } 19 else if(s[i]==':') 20 { 21 flag=false; 22 continue; 23 } 24 else ss=ss*10+(s[i]-'0'); 25 } 26 flag=true; 27 for(int i=0;i<e.size();i++) 28 { 29 if(e[i]!=':'&&flag) 30 { 31 E=E*10+(e[i]-'0'); 32 } 33 else if(e[i]==':') 34 { 35 flag=false; 36 continue; 37 } 38 else ee=ee*10+(e[i]-'0'); 39 } 40 sum=(E-S)*60+ee-ss; 41 return sum; 42 } 43 int main() 44 { 45 int time=T(); 46 cin>>n; 47 for(int i=1;i<=n;i++) 48 { 49 scanf("%d%d%d",&t[i],&v[i],&p[i]); 50 if(p[i]==0)//徹底揹包 51 { 52 for(int j=t[i];j<=time;j++) 53 dp[j]=max(dp[j],dp[j-t[i]]+v[i]); 54 } 55 else//咱們多重揹包和01揹包能夠一塊兒作操做 56 { 57 int num=min(p[i],time/t[i]); 58 for(int k=1;num>0;k<<=1) 59 { 60 if(k>num)k=num; 61 num-=k; 62 for(int j=time;j>=t[i]*k;j--) 63 dp[j]=max(dp[j],dp[j-t[i]*k]+v[i]*k); 64 } 65 } 66 } 67 cout<<dp[time];//輸出就好 68 }
int T() { int a1,a2,a3,a4; scanf("%d:%d%d:%d",&a1,&a2,&a3,&a4); int sum=(a3-a1)*60; sum=sum+a4-a2; return sum; }