| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1035 人关注过本帖
标题:[原创][背包问题穷举法]
只看楼主 加入收藏
激情依旧
Rank: 1
等 级:新手上路
威 望:2
帖 子:524
专家分:0
注 册:2005-4-4
收藏
 问题点数:0 回复次数:0 
[原创][背包问题穷举法]
背包问题:
 比如说现在有n件物品。每件物品都有价钱。现在给你一个书包。你只能负一定的重量。就在这一定的重量里。如何取物品可以取到最大的价值。大概意思就是这样。
#include<stdio.h>
#include<math.h>
void comb(int s[],int i)/*求每一次取的物品.s[]是做标记的*/
{   int j=0;
 while(i>0)
    { s[j++]=i%2;
      i=i/2;
    }
}
main()
{  int v[]={10,12,13,15,7,9};/*v为物品价钱*/
   int w[]={15,8,12,10,5,6};/*w为物品重量*/
   int sign[10],tw,maxv=0,i,j,k,temp_w,temp_v;/*sign[]存放每一次的方案
             tw是你输入的重量.temp_w是累加重量的
             temp_v是累加价值的*/
   int biao[10];/*存放最大值时候的标记*/
   printf("请输入背包的最大容量:\n");
   scanf("%d",&tw);
   for(i=0;i<pow(2,6);i++) /*一共有pow(2,n)种,比如你有2个物品的时候.
         就有00 01 10 11 4种情况.1就是表示取的物品*/
   { comb(sign,i);
      temp_w=0;
   temp_v=0;
      for(j=0;j<10;j++)
        if(sign[j]==1)    /*你所取的方案.1的就是表示取*/
  {  temp_w=temp_w+w[j];
        temp_v=temp_v+v[j];
  }
  if(temp_w<=tw&&temp_v>maxv)/*当这种方案的总重量不大于你限制的重量.
           和大于每一次求出来的最大值*/
  {  
   maxv=temp_v;
   for(k=0;k<10;k++)
    biao[k]=sign[k];  /*将最大值方案用数组biao[]来存放*/
  }
   }
    printf("你取的方案是:\n");/*以下为输出*/
   for(k=0;k<10;k++)
   {   
    if(biao[k]==1)
     printf("%d\t",w[k]);
   }
     printf("\n");
   for(k=0;k<10;k++)
   {
   if(biao[k]==1)
    printf("%d\t",v[k]);
   }
   printf("背包取的最大值是:%d\n",maxv);
}
对这个算法有兴趣而有看的不太明白的就加我QQ吧。
QQ:59071323
POPO:luodongming
E-mail: ldm03@
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 背包 
2005-06-12 10:29
快速回复:[原创][背包问题穷举法]
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016245 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved