1727 吃烤肉

来源:互联网 发布:方框图用什么软件 编辑:程序博客网 时间:2024/04/28 10:16
描述

Alex最近和朋友去HLX吃了一次自助烤肉。每种肉的价值都不同,既然花了钱,大家自然想把花的钱给吃回来。最好全吃像培根,鱿鱼之类的。但是每种肉供应有限,加之吃的种类太少也没意思。所以Alex决定在吃的种类不少于k种的前提下,尽量吃回最大价值的肉。但是Alex的肚子能装的东西是有限的...

输入

一共包含t组数据,对于每组数据:
第一行给出四个整数c(c>=k*m),s,k(k<s),m,分别代表Alex能吃下的烤肉总克数,烤肉品种总数,Alex决定最少吃的种数,和对于吃的某种肉,最少吃的克数。
以下s行,每行2个整数w(w>=m),v,分别代表每种肉的总克数和每克的价值。

输出

对于每组数据:
包含一行,为Alex能吃下的肉的最大总价值。





动态规划题目

#include<iostream>#include<vector>#include<algorithm>using namespace std;struct meat{ int weight; int value;};bool com( const struct meat& m1, const struct meat& m2 ){ if ( m1.value < m2.value )  return true; else  return false;}int main(){ int t; cin >> t; for ( int e = 0; e < t; e++ ) {  vector<struct meat> vp;  int c, s, k, m;      cin >> c >> s >> k >> m;  int w, v;  for ( int i = 0; i < s; i++ )  {    cin >> w >> v;   struct meat m = { w, v };   vp.push_back( m );  }  sort( vp.begin(), vp.end(), com );    int sum = 0;  for ( int i = 0; i < k; i++ )  {   vp[ s-1-i ].weight -= m;   sum += m * vp[ s-1-i ].value;  }       c -= m * k;   int r = s-1;  while ( r >= 0 && c > 0 )  {   if ( vp[ r ].weight != 0 )   {     if ( c > vp[ r ].weight )    {     sum += vp[ r ].value * vp[ r ].weight;     c -= vp[ r ].weight;     vp[ r ].weight = 0;    }    else    {     sum += c * vp[ r ].value;     break;    }   }   r--;  }    cout << sum << endl; } return 0;} 


原创粉丝点击