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

 12345678910111213141516171819202122232425 #include #include #include 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<