子集合数(定长解)

用定长的方法求解:

 

#include<iostream>
using namespace std;

long Judge(int k,int *X,int *array)
{
    
int i;              //判断计算函数
       long s=0;
       
for(i=1;i<=k;i++)
           
if(X[i]!=0)
               s
+=array[i];
           
return s;             
}


void Solution(int n,int *array,int result)
{                                    
//子集和数问题解向量长度固定的结构  
    int i,j;
    
int *X=new int [n+1];
    
long sum;
    i
=1;
       X[i]
=1;
       
while(i>=1)
       {      
           sum
=Judge(i,X,array);
           
           
if(sum<result)   //当搜索的解的和小于所给定的和数
           { 
               
if(i==n)
                   X[i]
=0;
               
               
if(i<n)
               {
                   i
++;
                   X[i]
=1;
               }
           }
           
           
if(sum==result)   //当搜索的解的和等于所给定的和数
           { 
               
if(i<n)
               {
                   i
++;
                   X[i]
=0;    
               } 
               
               
if(i==n)
               {  
                   
for(j=1;j<=n;j++)
                       cout
<<X[j]<<" ";
                   cout
<<endl;
                   X[i]
=0;    
               }
               
           }
           
           
if(sum>result) //当搜索的解的和大于所给定的和数
           {      
               X[i]
=0
               
if(i<n)
               {
                   i
++;
                   X[i]
=1;
               }
           }     
           
           
           
if(i==n&&X[i]==0)   //回溯
           {
               
while(X[i]==0&&i>=1)
                   i
--;
               X[i]
=0;
               
if(i>=1)
               {
                   i
++;
                   X[i]
=1;
               }
           }               
       }                                  
}

void main()
{
    
int n,i,result;
    cin
>>n>>result;
    
int *array=new int [n+1];
    
for(i=1;i<=n;i++)
        cin
>>array[i];
    Solution(n,array,result);
}

 

测试数据:

5 15

3 5 7 10 12

1 1 1 0 0

1 0 0 0 1

0 1 0 1 0

 

posted on 2009-10-19 18:16  Thank You  阅读(447)  评论(0)    收藏  举报

导航