洛谷P1417 烹调方案

洛谷P1417 烹调方案
如果是一般的01背包的话
选的先后是没关系的
但是这题选的先后是有关系的,因为他的价值是随着时间而变化的,
而你的01背包是做不到先选2再选1的
那么我们就跟国王游戏一样 用一个优先值对他们就行排序,表示如果初始价值相同
应该怎么选,这其实就是国王游戏,然后我们用贪心原则将他们
排好序,然后再来一遍01背包就行了

 

 1 #include <bits/stdc++.h> 
 2 #define For(i,j,k) for(int i=j;i<=k;i++) 
 3 #define int long long 
 4 using namespace std ; 
 5 
 6 const int N = 52 ; 
 7 struct node{
 8     int a,b,c ; 
 9 }m[N];
10 int n,T,ans ; 
11 int f[100011] ; 
12 
13 inline int read() 
14 {
15     int x = 0 , f = 1 ; 
16     char ch = getchar() ; 
17     while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar() ; } 
18     while(ch>='0'&&ch<='9') { x = x * 10+ch-48 ; ch = getchar() ; } 
19     return x * f ;  
20 }
21 
22 inline bool cmp(node x,node y) 
23 {
24     return x.c * y.b < y.c * x.b;
25 }
26 
27 signed main() 
28 {
29     T = read() ; n = read() ; 
30     For(i,1,n) m[i].a = read() ; 
31     For(i,1,n) m[i].b = read() ; 
32     For(i,1,n) m[i].c = read() ; 
33     sort(m+1,m+n+1,cmp) ; 
34     For(i,1,n) 
35       for(int j=T;j>=m[ i ].c;j--) 
36           f[ j ] = max( f[j],f[j-m[i].c]+m[i].a-m[i].b*j ) ;  
37     int ans = 0 ; 
38     For(i,0,T) 
39         if( f[ i ] > ans ) ans = f[ i ] ; 
40     printf("%d\n",ans) ; 
41     return 0 ; 
42 }

 

posted @ 2017-09-06 12:51  third2333  阅读(233)  评论(0编辑  收藏  举报