信息学奥赛一本通例9.13 庆功会

我的个人博客

例9.13 庆功会

来自信息学奥赛一本通

【题目描述】

为了庆贺班级在校运动会上取得全校第一名成绩,班主任决定开一场庆功会,为此拨款购买奖品犒劳运动员。期望拨款金额能购买最大价值的奖品,可以补充他们的精力和体力。

【输入】

第一行二个数n(n <= 500),m(m <= 6000),其中n代表希望购买的奖品的种数,m表示拨款金额。

接下来n行,每行3个数,v、w、s,分别表示第I种奖品的价格、价值(价格与价值是不同的概念)和能购买的最大数量(买0件到s件均可),其中v <= 100,w <= 1000,s <= 10。

【输出】

一行:一个数,表示此次购买能获得的最大的价值(注意!不是价格)。

【输入样例】

5 1000

80 20 4

40 50 9

30 50 7

40 30 6

20 20 1

【输出样例】

1040

时间限制: 1000 ms        内存限制 : 65536 KB

#include<cstdio>

int v[10001], w[10001];

int f[6001];

int n, m, nl;

int max(int a, int b)

{

return a > b ? a : b; //相当于if(a>b)return a;else return b;

}

int main()

{

scanf("%d%d", &n, &m);

for (int i = 1; i <= n; i++)

{

  int x, y, s, t = 1;

  scanf("%d%d%d", &x, &y, &s);

  while (s >= t)

  {

  v[++nl] = x * t; //相当于nl++;v[nl]=x*t;

  w[nl] = y * t;

  s -= t;

  t *= 2;

  }

  v[++nl] = x * s;

  w[nl] = y * s;

}

for (int i = 1; i <= nl; i++)

  for (int j = m; j >= v[i]; j--)

  f[j] = max(f[j], f[j - v[i]] + w[i]);

printf("%d\n", f[m]);

getchar(); //起暂停作用,便于观察输出结果

return 0;

}

我的个人博客

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 城市里 都在穿梭挣扎 以为有一盏华灯初上只为你 月明星稀下 又见一面旗帜 一面让你扬帆远航的旗 孤独的灵魂肆意妄为...
    新一菇凉阅读 240评论 1 3
  • AS使用CMake方式引入OpenCV native库 把从opencv官网中下载好的android包解压,你将看...
    myserendipit阅读 2,662评论 1 1
  • 似乎做朋友有点欠缺 又见面 一见如故 记忆犹存 只是冒然问一句 过得好吗? 跟我相处一见面是这样 那我们就生疏了 ...
    妙妙尼阅读 371评论 0 0