4131:Charm Bracelet
总时间限制:
1000ms
内存限制:
65536kB
描述
Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fill it with the best charms possible from the N(1 ≤ N≤ 3,402) available charms. Each charm iin the supplied list has a weight Wi(1 ≤ Wi≤ 400), a 'desirability' factor Di(1 ≤ Di≤ 100), and can be used at most once. Bessie can only support a charm bracelet whose weight is no more than M(1 ≤ M≤ 12,880).
Given that weight limit as a constraint and a list of the charms with their weights and desirability rating, deduce the maximum possible sum of ratings.
输入
Line 1: Two space-separated integers: N and M
Lines 2..N+1: Line i+1 describes charm i with two space-separated integers: Wi and Di
输出
Line 1: A single integer that is the greatest sum of charm desirabilities that can be achieved given the weight constraints
样例输入
4 6
1 4
2 6
3 12
2 7
样例输出
23
AC代码:
#include<cstdio>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
#include<string>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<unordered_map>
#include<unordered_set>
const int maxn = 3500 + 10;
const int INF = 0x3f3f3f3f;
int n, m;
int weight[maxn], value[maxn];
int f[13000];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d%d", &weight[i], &value[i]);
for (int j = 0; j <= m; j++) {//从前1件物品中取,总体积小于j
if (weight[1] <= j)f[j] = value[1];
else f[j] = 0;
}
for (int i = 2; i <= n; i++) {//从前i件物品中取
for (int j = m; j >= 0; j--) {//总体积小于j
if (weight[i] <= j)
f[j] = max(f[j], f[j - weight[i]] + value[i]);
}
}
printf("%d\n", f[m]);
return 0;
}