1. 程式人生 > >洛谷——P2095 營養膳食

洛谷——P2095 營養膳食

san fin etc 研究 family 做的 nta -i 希望

題目描述

Mr.L正在完成自己的增肥計劃。

為了增肥,Mr.L希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那樣的話就會導致缺少其他營養。Mr.L通過研究發現:真正的營養膳食規定某類食品不宜一次性吃超過若幹份。比如就一頓飯來說,肉類不宜吃超過1份,魚類不宜吃超過1份,蛋類不宜吃超過1份,蔬菜類不宜吃超過2份。Mr.L想要在營養膳食的情況下吃到更多的脂肪,當然Mr.L的食量也是有限的。

輸入輸出格式

輸入格式:

第一行包含三個正整數n(n≤200),m(m≤100)和k(k≤100)。表示Mr.L每頓飯最多可以吃m份食品,同時有n種食品供Mr.L選擇,而這n種食品分為k類。第二行包含k個不超過10的正整數,表示可以吃1到k類食品的最大份數。接下來n行每行包括2個正整數,分別表示該食品的脂肪指數ai和所屬的類別bi,其中ai≤100,bi≤k。

輸出格式:

包括一個數字即Mr.L可以吃到的最大脂肪指數和。

輸入輸出樣例

輸入:

6 6 3
3 3 2
15 1
15 2
10 2
15 2
10 2
5 3
輸出:
60

其實是一個大水題,難點在於怎樣理解題目,開始的時候我感覺應該是每一種菜可以隨便選,但是這種菜的選擇的個數有限,但是這樣做的會就會被樣例直接卡死。然後我就感覺是不是思路出錯了啊,結果果真是思路除了問題。
這個題假如我們有5種菜屬於第2個種類吧且第二種菜可以選3個,那麽我們只能在這五種菜中選擇3個
#include<cstdio>
#include<cstring>
#include
<iostream> #include<algorithm> #define N 505 using namespace std; int n,m,k,x,s[N],sum,ans; int read() { int x=0,f=1; char ch=getchar(); while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();} while(ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar(); return
x*f; } struct Node { int w,num; }node[N]; int cmp(Node a,Node b) { return a.w>b.w; } int main() { m=read(),n=read(),k=read(); for(int i=1;i<=k;i++) s[i]=read(); for(int i=1;i<=m;i++) { node[i].w=read(); node[i].num=read(); } sort(node+1,node+1+m,cmp); for(int i=1;i<=m;i++) { if(s[node[i].num]) { s[node[i].num]--; n--; ans+=node[i].w; } if(n==0) break; } printf("%d",ans); return 0; }

洛谷——P2095 營養膳食