pku1014

本文介绍了一个基于深度优先搜索算法解决背包问题的实例。通过定义数组记录不同物品的数量,并利用递归函数实现组合可能性的探索,判断是否能将给定数量的物品分为两组,使得两组的价值总和相等。
#include <stdio.h>

#define MAXM 7

int a[MAXM],sum,len;//,aa[MAXM]

bool DFS(int nowLen,int sum2,int val){
    
int i;
    
if(nowLen==len){
        
if(sum2==sum)
            
return 1;
        
else
            
return 0
    }

    
for(i=val;i<=6;i++){
        
if(a[i]>0){
            a[i]
--;
            
if(DFS(nowLen+1,sum2+i,i))
                 
return 1;
            a[i]
++;
        }

    }

    
return 0;  
}


int main()
{
    
int i,j,n=0,n1,sum2,nowLen,val;
    
bool ok=0;
    n
=1;
    scanf(
"%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]);
    
while (a[1>0||a[2]>0||a[3]>0||a[4]>0||a[5]>0||a[6]>0
    
{
        
if(a[6]>5){
            
if(a[6]%2==0)
                a[
6]=4;//aa[6]=
            else
                a[
6]=5;//=aa[6]
        }


        
if(a[5]>6){
            
if(a[5]%2==0)
                a[
5]=6;//=aa[5]
            else
                a[
5]=5;//=aa[5]
        }


        
if(a[4]>5){
            
if(a[4]%2==0)
                a[
4]=4;//aa[4]/
            else
                a[
4]=5;//=aa[4]
        }


        
if(a[3]>5){
            
if(a[3]%2==0)
                a[
3]=4;//aa[3]=
            else
                a[
3]=5;//aa[3]=
        }


        
if(a[2]>4){
            
if(a[2]%2==0)
                a[
2]=4;//aa[2]=
            else
                a[
2]=3;//aa[2]=
        }


        
if(a[1]>7){
            
if(a[1]%2==0)
                a[
1]=6;//aa[1]=
            else
                a[
1]=7;//aa[1]=
        }


        
//for(i=1;i<=6;i++)aa[i]=a[i]; 
        sum=0;
        
for(i=1;i<=6;i++)sum+=a[i]*i;

        
if(sum%2==1){
            printf(
"Collection #%d: Can't be divided. ",n);
            n
++;
            scanf(
"%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]);
            
continue;
        }


        sum
/=2;    j=1;
        n1
=0;
        
for(i=1;i<=6;i++){
            n1
+=a[i];        
        }


        
for(len=1;len<=n1/2;len++){
            
//for(i=1;i<=6;i++)a[i]=aa[i];//
            nowLen=1;    
            ok
=0;
            
for(i=1;i<=6;i++){
                
if(a[i]>0 ){
                    a[i]
--;
                    sum2
=val=i;    
                    
if(DFS(nowLen,sum2,val)){
                        ok
=1;
                        printf(
"Collection #%d: Can be divided. ",n);
                        
break;
                    }

                    a[i]
++;
                }

            }

            
if(ok)
                
break
        }

        
if(0==ok)
            printf(
"Collection #%d: Can't be divided. ",n);
        
        n
++;
        scanf(
"%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6]);
    }

    
return 0;
}


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值