• luogu P1417 烹调方案 |dp


    题目背景

    由于你的帮助,火星只遭受了最小的损失。但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星。不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~

    gw还是会做饭的,于是拿出了储藏的食物准备填饱肚子。gw希望能在T时间内做出最美味的食物,但是这些食物美味程度的计算方式比较奇葩,于是绝望的gw只好求助于你了。

    题目描述

    一共有n件食材,每件食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间。

    众所周知,gw的厨艺不怎么样,所以他需要你设计烹调方案使得美味指数最大

    输入格式

    第一行是两个正整数T和n,表示到达地球所需时间和食材个数。

    下面一行n个整数,ai

    下面一行n个整数,bi

    下面一行n个整数,ci

    输出格式

    输出最大美味指数


    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N=205;
    #define int long long
    struct node{
    	int a,b,c;
    }e[N];
    int dp[200005];
    inline bool cmp(node t1,node t2){
    	return t1.c*t2.b<t2.c*t1.b;
    }
    signed main(){
    	int T,n; cin>>T>>n;
    	for(int i=1;i<=n;i++)scanf("%lld",&e[i].a);
    	for(int i=1;i<=n;i++)scanf("%lld",&e[i].b);
    	for(int i=1;i<=n;i++)scanf("%lld",&e[i].c);
    	sort(e+1,e+n+1,cmp);
    	for(int i=1;i<=n;i++){
    		for(int j=T;j>=e[i].c;j--)
    		dp[j]=max(dp[j],dp[j-e[i].c]+e[i].a-j*e[i].b);
    	}
    	int ans=0;
    	for(int i=0;i<=T;i++)ans=max(ans,dp[i]);
    	cout<<ans<<endl;
    }
    
  • 相关阅读:
    【bzoj3676】[Apio2014]回文串 —— 回文自动机的学习
    树链剖分求LCA
    读入输出优化
    【bzoj3124】[Sdoi2013]直径
    【codevs2183】匹配字符串
    【codevs2011】【LNOI2013】最小距离之和
    【codevs1306】广播操的游戏
    【hdu3966】Aragorn's Story
    【hdu3518】Boring counting
    C++-HDU3400-Line belt[三分]
  • 原文地址:https://www.cnblogs.com/naruto-mzx/p/11895875.html
Copyright © 2020-2023  润新知