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

    转载: http://blog.csdn.net/dapengbusi/article/details/7463968

    动态规划0-1背包问题

    Ø
       问题描述:
       给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装
    入背包中物品的总价值最大?
    Ø
      对于一种物品,要么装入背包,要么不装。所以对于一种物品的装入状态可以取0和1.我们设物品i的装入状态为xi,xi∈ (0,1),此问题称为0-11背包问题。
                                   过程分析
     

        数据:物品个数n=5,物品重量w[n]={0,2,2,6,5,4},物品价值V[n]={0,6,3,5,4,6},

         (第0位,置为0,不参与计算,只是便于与后面的下标进行统一,无特别用处,也可不这么处理。)总重量c=10.

    Ø背包的最大容量为10,那么在设置数组m大小时,可以设行列值为6和11,那么,对于m(i,j)就表示可选物品为i…n背包容量为j(总重量)时背包中所放物品的最大价值。

     

                                             

    在得到在给定总重量时可以获得的最大value后,如何得到具体该放入哪些物品?也就是构造最优解的过程:

    下面是自己写的源码:

    1. #include<stdio.h>  
    2. #include<stdlib.h>  
    3. #include<iostream>  
    4. #include<queue>  
    5. #include<climits>  
    6. #include<cstring>  
    7. using namespace std;  
    8. const int c = 10;             //背包的容量  
    9. const int w[] = {0,2,2,6,5,4};//物品的重量,其中0号位置不使用 。   
    10. const int v[] = {0,6,3,5,4,6};//物品对应的待加,0号位置置为空。  
    11. const int n = sizeof(w)/sizeof(w[0]) - 1 ; //n为物品的个数   
    12. int x[n+1];  
    13. void package0_1(int m[][11],const int w[],const int v[],const int n)//n代表物品的个数   
    14. {  
    15.     //采用从底到顶的顺序来设置m[i][j]的值  
    16.     //首先放w[n]  
    17.     for(int j = 0; j <= c; j++)  
    18.        if(j < w[n]) m[n][j] = 0;     //j小于w[n],所对应的值设为0,否则就为可以放置   
    19.        else         m[n][j] = v[n];  
    20.          
    21.     //对剩下的n-1个物品进行放置。  
    22.     int i;  
    23.     for(i = n-1; i >= 1; i--)  
    24.         for(int j = 0; j <= c; j++)  
    25.            if(j < w[i])   
    26.                         m[i][j] = m[i+1][j];//如果j < w[i]则,当前位置就不能放置,它等于上一个位置的值。  
    27.                                             //否则,就比较到底是放置之后的值大,还是不放置的值大,选择其中较大者。              
    28.            else         m[i][j] = m[i+1][j] > m[i+1][j-w[i]] + v[i]?   
    29.                                   m[i+1][j] : m[i+1][j-w[i]] + v[i];    
    30. }  
    31. void answer(int m[][11],const int n)  
    32. {  
    33.     int j = c;  
    34.     int i;  
    35.     for(i = 1; i <= n-1; i++)  
    36.         if(m[i][j] == m[i+1][j]) x[i] = 0;  
    37.         else                    {   
    38.                                  x[i] = 1;  
    39.                                  j = j - w[i];  
    40.                                  }      
    41.     x[n] = m[i][j] ? 1 : 0;   
    42. }  
    43. int main()  
    44. {  
    45.  int m[6][11]={0};  
    46.    
    47.  package0_1(m,w,v,n);  
    48.  for(int i = 0; i <= 5; i++)  
    49.  {  
    50.      for(int j = 0; j <= 10; j++)  
    51.      printf("%2d ",m[i][j]);  
    52.      cout << endl;   
    53.  }   
    54.  answer(m,n);  
    55.  cout << "The best answer is: ";  
    56.  for(int i = 1; i <= 5; i++)  
    57.  cout << x[i] << " ";  
    58.  system("pause");  
    59.  return 0;  
  • 相关阅读:
    07.精益敏捷项目管理——敏捷发布计划
    06.精益敏捷项目——迭代0:准备第一次迭代
    05精益敏捷项目管理——超越Scrum
    04精益敏捷项目管理——精益组合管理
    22.敏捷估计与规划——Why Agile Planning Works笔记
    21.敏捷估计与规划——Communicating about Plans笔记
    20.敏捷估计与规划——Monitoring the Iteration plans笔记
    18.规划多小组的项目——Planning the Multiple-Team Project笔记
    17.敏捷估计与规划——Buffering Plans for Uncertainty笔记
    16.敏捷估计与规划——Estimating Velocity笔记
  • 原文地址:https://www.cnblogs.com/litian0605/p/5296448.html
Copyright © 2011-2022 走看看