信息学奥赛一本通例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

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;

}

我的个人博客

你可能感兴趣的:(信息学奥赛一本通例9.13 庆功会)