洛谷 P1833【櫻花】

題目背景

《愛與愁的故事第四彈·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

輸入輸出樣例

輸入樣例#1:

  

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

輸出樣例#1:

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;
}
相關文章
相關標籤/搜索