营养膳食-模拟

传送门

(过水已隐藏的蒟蒻?

当成动态规划做

想转移方程想好久

一通瞎搞

搞到崩溃

突然(咳咳想到要排个序

就糊弄出来了?

(我该开心嘛?

--------------------------------------------------------------------------------------------

题目描述
阿月正在女朋友宁宁的监督下完成自己的增肥计划。
为了增肥,阿月希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养。阿月通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超过若干份。比如就一顿饭来说,肉类不宜吃超过 1 份,鱼类不宜吃超过 1 份,蛋类不宜吃超过 1 份,蔬菜类不宜吃超过 2 份。阿月想要在营养膳食的情况下吃到更多的脂肪,当然阿月的食量也是有限的。


输入
输入第一行包含三个正整数 n(n≤200),m(m≤100)和 k(k≤100)。表示阿月每顿饭最多可以吃 m 份食品,同时有 n 种食品供阿月选择,而这 n 种食品分为 k 类。

第二行包含 k 个不超过 10 的正整数,表示可以吃 1 到 k 类食品的最大份数。

接下来 n 行每行包括 2 个正整数,分别表示该食品的脂肪指数 ai 和所属的类别 bi,其中 ai≤100,bi≤k。


输出
输出一个数字即阿月可以吃到的最大脂肪指数和。
样例输入

6 6 3

3 3 2

15 1

15 2

10 2

15 2

10 2

5 3

样例输出

60

--------------------------------------------------------------------------------------------

贪心:

吃这m份食品的时候

尽量先吃脂肪最高的

只要这类食物没吃过上限就好

所以简简单单的给这些食品按脂肪量快排一下就好

(蒟蒻的我还是不想用重载运算符

傻fufu的写着cmp

#include<cstdio>
#include<algorithm>
using namespace std;

int n,m,k,mm;
int v[105],v1[105];//一次可以吃1到k类食品的最大份数
struct diet
{
    int a,b;
} q[205];
int f[105];

bool cmp(diet x,diet y)
{
    return x.a > y.a;
}

int main()
{
//    freopen("diet.in","r",stdin);
//    freopen("diet.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for(int i = 1; i <= k; i++)
    {
        scanf("%d",&v[i]);
    }
    for(int i = 1; i <= n; i++)
    {
        scanf("%d%d",&q[i].a,&q[i].b);
    }
    
    sort(q+1,q+1+n,cmp);

    for(int i = 1; i <= n; i++)
    {
        if(mm + 1 <= m && v1[q[i].b] + 1 <= v[q[i].b])
        {
            if(f[i - 1] + q[i].a > f[i])
                f[i] = f[i - 1] + q[i].a,v1[q[i].b]++,mm++;
        }
        else
            f[i] = f[i - 1];
    }
    printf("%d",f[n]);
    return 0;
}
原文地址:https://www.cnblogs.com/darlingroot/p/10890422.html