ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

洛谷P2979 cheese towers 完全背包

2020-05-29 14:57:10  阅读:287  来源: 互联网

标签:cheese P2979 背包 洛谷 int 奶酪 高度 f2 maxt


因为背包忘了不少,所以最近在找usaco上的一些难度不大的背包题练习

题目链接: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中取最大价值即可。

 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 }
洛谷2979

 

标签:cheese,P2979,背包,洛谷,int,奶酪,高度,f2,maxt
来源: https://www.cnblogs.com/edmunds/p/12987419.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[[email protected]]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有