信息学奥赛一本通例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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值