(过水已隐藏的蒟蒻?
当成动态规划做
想转移方程想好久
一通瞎搞
搞到崩溃
突然(咳咳想到要排个序
就糊弄出来了?
(我该开心嘛?
--------------------------------------------------------------------------------------------
题目描述
阿月正在女朋友宁宁的监督下完成自己的增肥计划。
为了增肥,阿月希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养。阿月通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超过若干份。比如就一顿饭来说,肉类不宜吃超过 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;
}