Openjudge Charm Bracelet

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 charmiin 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
来源
USACO 2007 December Silver

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int W[3403],D[3403];
int N,M;
int F[12885];
int main(){
    ios::sync_with_stdio(false);
    cin>>N>>M;
    for(int i=1;i<=N;i++){
        cin>>W[i]>>D[i];
    }
    for(int i=1;i<=M;i++){
        F[i]=0;
    }
    for(int i=1;i<=N;i++){
        for(int j=M;j>=W[i];j--){//M到W[i]的所有背包都可以容下物品i,由于状态转移方程从左面读值,所以必须从右向左进行
            F[j]=max(F[j],F[j-W[i]]+D[i]);
//当i==1时,整个滚动数组全为0,M到W[i]的所有背包都可以容下物品i
//当i>1时,即为状态转移方程
        }
    }
    cout<<F[M];
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注