1. 程式人生 > >烹調方案

烹調方案

表示 並且 freopen con 要花 n) 火星 遊戲 準備

題目背景

由於你的幫助,火星只遭受了最小的損失。但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

輸出格式:

輸出最大美味指數

沒有特別強烈的感覺到這是個01背包,這是不應該的

一上來直接枚舉,沒有排序,後來錯了後感覺沒法排序

其實就像國王遊戲那樣,寫出兩項來,前一項大於後一項就可以了,這是不應該的

最後改錯的時候把dp初值都附成-INF了,這不符合題目意思,題目中從任意時刻開始都可以,

並且並沒有說明a,b,c都是正數,這是不應該的

還有就是要開long long 1e5*1e5是會爆int的,沒有很強烈的意識,這是不應該的

下次不能再這樣了

#include<iostream>
#include
<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; const ll maxn=57; const ll maxm=1e5+7; const ll INF=0x7f7f7f7f; ll t,n,ans=0; ll f[maxn][maxm]; struct Node{ ll a,b,c; bool operator<(const Node&tmp)const{ return
c*tmp.b<tmp.c*b; } }node[maxn]; int main(){ //freopen("a.in","r",stdin); cin>>t>>n;//memset(f,-INF,sizeof(f)); for(ll i=1;i<=n;i++) cin>>node[i].a; for(ll i=1;i<=n;i++) cin>>node[i].b; for(ll i=1;i<=n;i++) {cin>>node[i].c;} sort(node+1,node+n+1); f[0][0]=0; for(ll i=1;i<=n;i++){ for(ll j=1;j<=t;j++){ f[i][j]=max(f[i][j],f[i-1][j]); if(j>=node[i].c) f[i][j]=max(f[i][j],f[i-1][j-node[i].c]+node[i].a-j*node[i].b); } } ans=0; for(ll i=1;i<=n;i++){ for(ll j=1;j<=t;j++){ ans=max(ans,f[i][j]); } } cout<<ans<<endl; return 0; }

烹調方案