zoukankan      html  css  js  c++  java
  • 动态规划 01背包问题

    0-1背包
    Description
    给定n(n<=100)种物品和一个背包。物品i的重量是wi,价值为vi,背包的容量为C(C<=1000)。问:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。
    Input
    共有n+1行输入: 第一行为n值和c值,表示n件物品和背包容量c; 接下来的n行,每行有两个数据,分别表示第i(1≤i≤n)件物品的重量和价值。
    Output
    输出装入背包中物品的最大总价值。
     
    Sample Input 1
    5 10 2 6 2 3 6 5 5 4 4 6
    Sample Output 1
    15
     
     
    分析 :
      n为有n个物品,c为背包空间
     
      设dp[i][j]为在前i个物品中选择,背包空间为j时,装入的最大价值,初始化:边界0初始化为0,答案在dp[n][c]
      如果当前j装得下 j >= obj_weight,状态方程:
      dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - obj_weight] + obj_price);
      如果当前j装不下,状态方程:
      dp[i][j] = dp[i - 1][j];
     
    #include <iostream>
    using namespace std;
    
    #define NUM 1000
    
    int dp[NUM][NUM];
    
    int max(int a, int b) {
        return a > b ? a : b;
    }
    int main() {
        int n;//n个物品
        int c;//背包容量
        cin >> n >> c;
        int  weight_price_table[100][2];
        
        for (int i = 1; i <= n; i++) {
            cin >> weight_price_table[i][0] >> weight_price_table[i][1];
        }
        
        //初始化边界 当i=0,j=0时 dp = 0
        for (int i = 0; i < NUM; i++) {
            dp[0][i] = 0;
            dp[i][0] = 0;
        }
    
    
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= c; j++) {
                int obj_weight = weight_price_table[i][0];
                int obj_price = weight_price_table[i][1];
                if (j >= obj_weight) {//如果装得下
                    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - obj_weight] + obj_price);
                }
                else {//装不下
                    dp[i][j] = dp[i - 1][j];
                }
                
            }
        }
    
        cout << dp[n][c];
    
    
    
    }
     
  • 相关阅读:
    快速幂模板
    部分有关素数的题
    POJ 3624 Charm Bracelet (01背包)
    51Nod 1085 背包问题 (01背包)
    POJ 1789 Truck History (Kruskal 最小生成树)
    HDU 1996 汉诺塔VI
    HDU 2511 汉诺塔X
    HDU 2175 汉诺塔IX (递推)
    HDU 2077 汉诺塔IV (递推)
    HDU 2064 汉诺塔III (递推)
  • 原文地址:https://www.cnblogs.com/likeghee/p/11770388.html
Copyright © 2011-2022 走看看