题目描述:
小王想在接下来一段时间将过去出的游戏全部玩一遍,但是时间有限,于是他给每个游戏标上一个成就值,同时估算了完成这些游戏所需要的时间。现在他只有x天时间,那么,他所玩完的游戏的成就值之和最大能达到多少?(每个游戏必须玩完才能获得成就值)
输入:
第一行输入case数T(0<T<20)。对于每个case,第一行输入游戏的数目N(0<N<11),总时间X(0<X<1000)用空格分隔。从第二行到第N+1行每行输入游戏的成就值Ai(0<Ai<10000),所需要花费时间Bi(0<Bi<10000)。
输出:
对每个case输出一行,成就值之和的最大值。
样例输入:
2
2 2
10 1
20 2
3 4
10 2
18 3
10 2
20
20
样例输出:
20
20
核心代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int maxValue(int n, int x, int *v, int *w) { //01背包问题
int res[10001];
memset(res, 0, sizeof(res)); //数组初始化
for (int i = 0; i < n; i++)
for (int j = x; j >= w[i]; j--)
res[j] = max(res[j - w[i]] + v[i], res[j]);
int result = res[x];
return result;
}
int main()
{
int rr[21]; //存放结果
//memset(rr, 0, sizeof(rr));
int t;
cin >> t; //case数
for (int i = 0; i < t; i++) {
int *v = new int[10001]; //v[]成就值数组
int *w = new int[10001]; //w[]花费时间数组
int n, x; //游戏数目和总时间
cin >> n >> x;
for (int j = 0; j < n; j++)
cin >> v[j] >> w[j];
int num = maxValue(n, x, v, w);
rr[i] = num;
delete[] v;
delete[] w;
}
for (int i = 0; i < t; i++) {
cout << rr[i] << endl;
}
return 0;
}