POJ3624Charm Bracelet(典型01背包问题)

    xiaoxiao2021-04-13  33

    Time Limit: 1000MS          Memory Limit: 65536K          Total Submissions: 32897          Accepted: 14587

    Description

    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 i in 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.

    Input

    * 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

    Output

    * Line 1: A single integer that is the greatest sum of charm desirabilities that can be achieved given the weight constraints

    Sample Input

    4 6 1 4 2 6 3 12 2 7

    Sample Output

    23

    一、题目大意

          有N个物品,分别有不同的重量Wi和价值Di,Bessie只能带走重量不超过M的物品,要是总价值最大,并输出总价值。

     

    二、解题思路

         典型的动态规划题目,用一个数组记录背包各个重量的最优解,不断地更新直到穷尽所有可能性。

         状态更新公式:state[weight] = max{state[weight-W[i]]+D[i], state[weight]}

     

    三、具体代码 

    1 // 背包问题(动态规划) 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #define MAXN 3402 6 #define MAXM 12880 7 using namespace std; 8 9 int main(){ 10 int N, M, W[MAXN+5], D[MAXN+5], dp[MAXM+5]; 11 while(scanf("%d%d", &N, &M) != EOF){ 12 for(int i=0; i<N; i++){ 13 scanf("%d%d", &W[i], &D[i]); 14 } 15 memset(dp, 0, sizeof(dp)); 16 for(int i=0; i<N; i++){ 17 for(int left_w=M; left_w>=W[i]; left_w--){ 18 dp[left_w] = max(dp[left_w-W[i]]+D[i], dp[left_w]); 19 } 20 } 21 printf("%d\n", dp[M]); 22 } 23 24 return 0; 25 } View Code

     

    转载请注明原文地址: https://ju.6miu.com/read-669203.html

    最新回复(0)