我的个人博客
例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;
}