[USACO10JAN]奶酪塔Cheese Towers

题意翻译

题目描述

FJ要建一个奶酪塔,高度最大为T。他有N种奶酪。第i种奶酪的高度为Hi(一定是5的倍数),价值为Vi。一块高度Hi>=K的奶酪被称为大奶酪,一个奶酪如果在它上方有大奶酪(如果有多块就只算一次),它的高度Hi就会变成原来的4/5.。FJ想让他的奶酪塔价值和最大。请你求出这个最大值。

输入格式:

第一行三个数N,T,K,意义如上所述。 接下来n行,每行两个数V_i,h_i(注意顺序)

输出格式:

奶酪塔的最大价值

输入格式

* Line 1: Three space-separated integers: N, T, and K

* Lines 2..N+1: Line i+1 contains two space separated integers: V_i and H_i

输出格式

* Line 1: The value of the best tower FJ can build

输入输出样例

输入 #1
3 53 25 
100 25 
20 5 
40 10 
输出 #1
240 

【解题思路】

如果没有大奶酪,这道题就是一道裸的完全背包。

稍微思考能够发现,最有解只有两种情况:要么整个奶酪塔上都没有大奶酪,要么奶酪塔的最上面一块是大奶酪。因为如果在奶酪塔的中间位置有一个大奶酪,那么显然把这块大奶酪提到奶酪塔的最顶端不会使答案变劣。

对于第一种情况,直接做完全背包即可。

对于第二种情况,我们可以枚举最上面的那块大奶酪i,用v[i]+f[(T-h[i])*5/4]更新ans。

最后两种情况取max即可。

【code】

 1 #include <cstdio>
 2 using namespace std;
 3 int n,t,k;
 4 int f[2005],v[1005],h[1005],ans;
 5 inline int Max(int a,int b){
 6     return a>b?a:b;
 7 }
 8 int main(){
 9     scanf("%d%d%d",&n,&t,&k);
10     for(register int i=1;i<=n;i++){
11         scanf("%d%d",&v[i],&h[i]);
12         for(register int j=h[i];j<=t*5/4;j++)
13              f[j]=Max(f[j],f[j-h[i]]+v[i]);
14     }
15     ans=f[t];
16     for(register int i=1;i<=n;i++)
17         if(h[i]>=k)
18             ans=Max(ans,f[(t-h[i])*5/4]+v[i]);
19     printf("%d\n",ans);
20     return 0;
21 }

 

转载于:https://www.cnblogs.com/66dzb/p/11257387.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值