题解:很清晰看到樱花树可以看得次数有三种,一次,多次,无数次,很显然这是一道混合背包的裸题,要用到二进制优化。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 int t1,t2,dp[1005],w[1000005],c[1000005],t[10005]; 9 int a[10005],b[10005]; 10 int n,cnt; 11 12 inline void op() 13 { 14 for(int i=1;i<=n;i++) 15 { 16 for(int j=1;j<=t[i];j=j<<1) 17 { 18 t[i]-=j; 19 w[++cnt]=a[i]*j; 20 c[cnt]=b[i]*j; 21 } 22 if(t[i]!=0) 23 { 24 w[++cnt]=a[i]*t[i]; 25 c[cnt]=b[i]*t[i]; 26 } 27 } 28 return; 29 } 30 31 int main() 32 { 33 int x1,x2,y1,y2; 34 scanf("%d:%d%d:%d%d",&x1,&x2,&y1,&y2,&n); 35 t1=x1*60+x2; t2=y1*60+y2; 36 int time=t2-t1; 37 for(int i=1;i<=n;i++) 38 { 39 scanf("%d%d%d",&a[i],&b[i],&t[i]); 40 if(t[i]==0) t[i]=9999999; 41 } 42 op(); 43 for(int i=1;i<=cnt;i++) 44 for(int v=time;v>=w[i];v--) 45 dp[v]=max(dp[v],dp[v-w[i]]+c[i]); 46 printf("%d ",dp[time]); 47 return 0; 48 }