码迷,mamicode.com
首页 > 其他好文 > 详细

出差之前写一个0-1背包的程序吧

时间:2016-04-15 21:38:05      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

又要出差了,也不知道多久才能回来,这段时间应该都不能更新博客了,写了0-1背包程序热热手吧。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 #define MAX_NUM     20   //物品最大个数
  5 #define MAX_PACK    100  //背包容量
  6 
  7 int result[MAX_NUM][MAX_PACK]; //全局变量默认初始化0
  8 
  9 /*
 10  * 0 1背包问题动态规划方程
 11  * 
 12  * m[i][j]代表已经选完前i-1个物品背包容量剩余j时的最大值
 13  *
 14  * m[i][j] = {
 15  *         0                        j = 0 || i = 0;
 16  *               m[i-1][j]                    j < weight[i];
 17  *        max(m[i-1][j],m[i-1][j-weight[i]] + value[i])    j >= weight[i];
 18  *           }
 19  *
 20  */
 21 
 22 
 23 /*获取最大值得计算函数*/
 24 int knapsack(int weight[],int value[],int n,int m)
 25 {
 26     int i,j;
 27     
 28     for(i = 1; i < n; i++)
 29     {
 30         for(j = 1; j <= m; j++)
 31         {//j 包含m 
 32             if(weight[i] <= j)
 33             {//背包能放下该物品
 34                 if(result[i-1][j-weight[i]] + value[i] >= result[i-1][j])
 35                 {
 36                     result[i][j] = result[i-1][j-weight[i]] + value[i];
 37                 }    
 38                 else
 39                 {
 40                     result[i][j] = result[i-1][j];
 41                 }
 42             }
 43             else
 44             {//背包不能放下该物品
 45                 result[i][j] = result[i-1][j]; 
 46             }
 47         }
 48     }
 49 
 50     return result[n - 1][m];
 51 }
 52 
 53 /*构造0 1背包的最优解---即哪些物品被选中了*/
 54 int knapsack_construct(int weight[],int n,int m,int selected[])
 55 {
 56     int i,contains;
 57     
 58     contains = m;
 59     for(i = n - 1; i > 0; i--)
 60     {
 61         if(result[i][contains] > result[i - 1][contains])
 62         {//说明放了第i个物品
 63             selected[i] = 1;
 64             contains -= weight[i]; //更新背包容量  
 65         }
 66         else
 67         {
 68             selected[i] = 0;
 69         }
 70 
 71     }    
 72 }
 73 
 74 
 75 int main()
 76 {
 77     int i,weight[MAX_NUM],value[MAX_NUM],m,n;
 78     int selected[MAX_NUM];
 79 
 80     scanf("%d%d",&n,&m);
 81     
 82     for(i = 0; i < n; i++)
 83     {
 84         scanf("%d%d",&weight[i],&value[i]);
 85     }
 86 
 87     int max_value = knapsack(weight,value,n,m);
 88     printf("最大背包价值:%d\n",max_value);
 89     
 90     knapsack_construct(weight,n,m,selected);
 91 
 92     for(i = 0; i < n; i++)
 93     {
 94         if(selected[i] == 1)
 95         {
 96             printf("%d ",i + 1);
 97         }
 98     }
 99 
100     printf("\n");
101 }

 

出差之前写一个0-1背包的程序吧

标签:

原文地址:http://www.cnblogs.com/daimadebanyungong/p/5396884.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!