洛谷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 }
时间: 2024-10-09 17:30:16