zoukankan      html  css  js  c++  java
  • 洛谷P2979 cheese towers

    因为背包忘了不少,所以最近在找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
  • 相关阅读:
    python解析网页
    node.js 爬虫
    c++ split实现
    foldl foldr
    爬虫http header gzip
    命令[10]
    命令[08]
    命令[15]
    命令[13]
    命令[11]
  • 原文地址:https://www.cnblogs.com/edmunds/p/12987419.html
Copyright © 2011-2022 走看看