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]; } |