洛谷P2979 cheese towers
题目链接:https://www.luogu.com.cn/problem/P2979
题意:有n种奶酪,每种有高度h和价值v,高度>=k称为大奶酪。大的压在上面,下面所有奶酪的高度会变为原来的4/5(只考虑最上面的一个大奶酪的效果,意思是下面的不会重复被压缩4/5)。现在给定最大高度t,求能得到的最大价值。
想了一个奇怪的做法:f[j]表示高度为j的最大价值。给奶酪升序排序,因为大奶酪在上面更优。先开一个f2数组直接做完全背包,之后再用f2数组更新f数组的状态:如果当前i不是大奶酪就还是直接做完全背包,
否则就用方程f[(j-a[i].h)/5*4+a[i].h]=max(f[(j-a[i].h)/5*4+a[i].h],f2[j-a[i].h]+a[i].v)更新压缩后的价值,最后再高度为0-T中取最大价值即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxt=2000+10; 5 struct st{int v,h;}a[maxt]; 6 int f[maxt],f2[maxt],n,t,k,i,j,ans; 7 8 bool cmp(st p,st q){return p.h<q.h;} 9 10 int main(){ 11 cin>>n>>t>>k; 12 for (i=1;i<=n;i++) cin>>a[i].v>>a[i].h; 13 sort(a+1,a+n+1,cmp); 14 for (i=1;i<=n;i++) 15 for (j=a[i].h;j<=t*2;j++) 16 f2[j]=max(f2[j],f2[j-a[i].h]+a[i].v); 17 for (i=1;i<=n;i++) 18 for (j=0;j<=t*2;j++) 19 if (a[i].h<=j&&j%5==0){ 20 if (a[i].h<k) f[j]=max(f[j],f[j-a[i].h]+a[i].v); 21 else f[(j-a[i].h)/5*4+a[i].h]=max(f[(j-a[i].h)/5*4+a[i].h],f2[j-a[i].h]+a[i].v); 22 } 23 for (i=0;i<=t;i++) ans=max(ans,f[i]); 24 cout<<ans<<endl; 25 return 0; 26 }