背包算法(Java 实现)

来源:互联网 发布:电脑没网络怎么装驱动 编辑:程序博客网 时间:2024/05/14 23:20

/**//**
 * 背包问题
 * 背包问题是计算机科学里的经典问题。在最简单的形式中,包括试图将不同重量的数据项放到
 * 背包中.以使背包最后达到指定的总重量。不需要把所有的选项都放入背包中。
 * 举例来说,假设想要背包精确地承重20磅,并且有5个可以选择放入的数据项,它们的重量
 * 依次为11磅、8磅、7磅、6磅和5磅。对于选择放入的数据项数量不大时,人类很善于通过观察
 * 就可以解决这个问题。于是大概可以计算出只有8磅、7磅和5磅的数据项加在一起和为20磅。
 * 如果想要计算机来解决这个问题,就需要给计算机更详细的指令。算法如下:
 * 1.如果在这个过程中的任何时刻,选择的数据项的总和符合目标重量,工作就完成了。
 * 2.从选择第一个数据项开始。剩余的数据项的加和必须符合背包的目标重量减去第一个数据  
 *     项的重量;这是一个新的目标重量。
 * 3.逐个地试每种剩余数据顶组合的可能性。但是,注意并不需要去试所有的组合,因为只要  
 *     数据顶朗和大于目标重量的时候,就停止添加数据项。
 * 4.如果设有组合合适的话,放弃第—‘个数据项,并且从第二个数据项开始再重复一边整个  
 *     过程。
 * 5.继续从第三个数据项开始,如此下去直到你已经试过所有的组合,这时知道没有解决答案  
 *     。
 *     在刚刚描述的这个例子中,从11开始。现在想要剩余的数据项和为9(20减去u)。对于9,
 *     从很小的8开始。现在想要剩余的数据项和为1(9减去8)。从7开始,但是它大于L,于是尝  
 *     试6,然后试5*它们都太大了d现在已经试过了所有的数据项,所以知道包含8的任何组合   
 *     和都不可能为9。接着尝试7,于是现在开始找的目标为2(9减去7)。
 *
 
*/
public class Beibao{
     
static int[] a=new int[5]; //背包重量
     static int[] b=new int[5]; //结果数组
     static int flag=0;          //下一个候选项
   
     
static int bound=20;        //总重量
     static int totle=0;         //每次选择后的总重量
    
     
public static void inserttry(int i,int leftbound,int t){
        
if(i<5&&leftbound<=totle){
            
if(a[i]<leftbound){
                    b[t
++]=a[i];
                    totle
=totle-a[i];
                  
                    leftbound
=leftbound-a[i];
                    i
++;
                    inserttry(i,leftbound,t);
          }

        
else if(a[i]>leftbound){
                    totle
=totle-a[i];
                    i
++;
                    inserttry(i,leftbound,t);
                    }

              
else {
                     b[t]
=a[i];
                     
return;
               }

          }

             
else    {
                      
                       leftbound
=leftbound+b[--t];
                      
                      
                       
for(int f=0;f<5;f++)
                        
{
                            
if (a[f]==b[t]) {flag=++f; break;}
                        }

                     
                       b[t]
=0;
                     
                       totle
=0;
                       
for(int m=flag;m<5;m++)
                       
{    totle+=a[m];
                       }

                      inserttry(flag,leftbound,t);
                   
                     }

       
             
return;
         }

       
public static void main(String[] args){
            a[
0]=11;
            a[
1]=8;
            a[
2]=6;
            a[
3]=7;
            a[
4]=5;
           
            
for(int i=0;i<5;i++{ b[i]=0;}
            
for(int i=0;i<5;i++{
                 totle
+=a[i];
            }

           
            inserttry(
0,20,0); 
            
for(int i=0;i<5;i++){
               System.
out.println(b[i]);
              }
 
           }

}
 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ps选区选多了怎么办 香港货物被海关扣了怎么办 羽绒服棉填充物不均匀了怎么办 蛀牙到牙神经了怎么办 t恤袖子长了怎么办 t恤袖子短了怎么办 ofo突然要交押金余款怎么办 裙子的腰小了怎么办 白衬衣棉质变软怎么办? 车被自行车刮了怎么办 刮花别人的车门怎么办 破腹产九个月意外怀孕怎么办 破腹产一年半意外怀孕怎么办 37天流产了该怎么办 旧鞋穿着磨脚了怎么办 皮鞋磨脚怎么办小窍门 拉链从下面开了怎么办 高帮足球鞋松了怎么办 橡筋裤头太紧了怎么办 内增高鞋跟太高怎么办 电脑增高架高了怎么办 银行取钱走后回来说少了怎么办 运动t桖太大了怎么办 袖口松紧太紧了怎么办 衣服穿着就皱了怎么办 麻料的衣服很皱怎么办 麻料衣服皱了怎么办 棉麻裤子皱了怎么办 裙子屁股坐皱了怎么办 真丝衣服洗皱了怎么办 粘纤的衣服皱了怎么办 硅胶手机壳粘灰怎么办 橡筋裤子买大了怎么办 橡筋裤子腰小了怎么办 地垫粘瓷砖上怎么办 汽车围裙锈透了怎么办 万能胶水沾到手上怎么办 圆领体恤领口容易皱怎么办 上衣剪了个洞怎么办 上衣破了个洞怎么办 鸟屎腐蚀车漆怎么办