题目背景
小明准备请小红去一家咖啡厅,共进烛光晚餐。小红高兴地和他一起去了咖啡厅。
题目描述
小红说:“小明,你点菜吧。”小明看到菜单上有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; }