一、分析题目
有些饭非常多,可以看作可以一直吃,有些饭很少,只能吃一次。
请你帮助他求出他最多可以吃多少饭,并输出此时所需时间。
从题目我们可以看出,本题为混合背包;
贪心最多90pts;
那么,对于每一顿饭
若能吃无数次,则有:
1 2 3
| for(int w = a[i].t;w<=t;w++){ dp[w]=max(dp[w],dp[w-a[i].t]+a[i].c); }
|
若只能吃一次,则有:
1 2 3
| for(int w = t;w>=a[i].t;w--){ dp[w]=max(dp[w],dp[w-a[i].t]+a[i].c); }
|
二、数据范围
保证0<=ti ;
无穷大符号是”+&
所以 当ti==0时,输出+&;
1 2 3 4
| if(a[i].t==0&&a[i].c){ cout<<"+&"<<endl; return 0; }
|
三、$AC$ $Code$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include<iostream> using namespace std; long long dp[1000010]; struct supur{ int t,c,flag; }a[1000001]; int main(){ int n,t; cin>>n>>t; for(int i = 1;i<=n;i++){ cin>>a[i].t>>a[i].c>>a[i].flag; if(a[i].t==0&&a[i].c){cout<<"+&"<<endl;return 0;} } for(int i = 1;i<=n;i++){ if(a[i].flag==0){ for(int w = a[i].t;w<=t;w++){ dp[w]=max(dp[w],dp[w-a[i].t]+a[i].c); } }else{ for(int w = t;w>=a[i].t;w--){ dp[w]=max(dp[w],dp[w-a[i].t]+a[i].c); } } } cout<<dp[t]; return 0; }
|