P2079 烛光晚餐

题目背景

小明准备请小红去一家咖啡厅,共进烛光晚餐。小红高兴地和他一起去了咖啡厅。

题目描述

小红说:“小明,你点菜吧。”小明看到菜单上有N道菜,每道菜的价格是Ci。小明对每道菜的喜爱程度是Xi,小红对每道菜的喜爱程度是Yi。(喜爱程度可能为负数)(小明:以我对她的了解,我给你的数据不会错的)

小明带了V元钱,他点的菜的总价格不能超过V(小明:当然得我请客啦,显得我大方。)

小明希望让小红吃得开心,所以当然要让她的总喜爱程度尽量大。当然,小明也要考虑自己的感受,点的所有菜的总喜爱程度需要大于等于0。(小明:要是我吃得不好,她看见我会难过的)

请你帮小明写一个程序,计算出他的总喜爱程度大于等于0的前提下,小红的喜爱程度的最大值。(小明:你的程序一定要靠谱啊,我得给她一个好印象)

输入输出格式

输入格式:

第1行,两个正整数N,V。

之后N行,每行3个空格隔开的正整数Ci,整数Xi,Yi。

输出格式:

一行,一个正整数,表示他的总喜爱程度大于等于0的前提下,小红的喜爱程度的最大值。如果这个最大值小于0,输出-1.

#include<bits/stdc++.h>
using namespace std;
int vt,n,v,m,h,f[2100][2100][2];
int main()
{
    cin>>n>>vt;
    for(int i=0;i<=vt;i++)
    for(int j=-600;j<=600;j++)f[i][j+1000][1]=f[i][j+1000][0]=-1e8;
    f[0][1000][0] = 0;
    for(int i=1;i<=n;i++)
    {
        cin>>v>>m>>h;
        int i1=i&1,i2=i&1^1;
        for(int j=0;j<=vt;j++)
        for(int k=-500;k<=500;k++)
        {
            f[j][k+1000][i1]=max(f[j][k+1000][i1],f[j][k+1000][i2]);
            if(j>=v)f[j][k+1000][i1]=max(f[j][k+1000][i1],f[j-v][k-m+1000][i2]+h);
        }
    }
    int ans=-1;
    for(int j=0;j<=vt;j++)
    for(int i=0;i<=500;i++)
    ans=max(ans,f[j][i+1000][n&1]);
    if(ans<0)ans=-1;
    cout<<ans;
}

猜你喜欢

转载自www.cnblogs.com/SFWR-YOU/p/10887256.html