先将数据按从大到小进行排序,然后使用DFS所有可能
#include<iostream>
using   namespace   std ;
int  a [ 100 ] = { 4 , 3 , 1 , 2 , 1 , 2 } ;
bool  x [ 100 ] ; //标记第i个元素是否已经使用
int  N = 6 ; //元素个数
int  t = 4 ; //目标和
int  sum ; //当前和
int  cmp ( const   void   * a , const   void   * b )
{
     return   * ( int   * ) b - * ( int   * ) a ;
}
void  backtrace ( int  n )
{
     if ( sum > t ) //当前和大于t
         return   ;
     if ( sum = = t ) //当前和等于t,输出结果
     {
         for ( int  j = 0 ; j < n ; + + j )
         {
             if ( x [ j ] )
                 cout < < a [ j ] < < " " ;
         }
         cout < < endl ;
         return ;
     }
     if ( n = = N ) //超过n层
         return   ;
     for ( int  i = n ; i < N ; + + i )
     {
         if ( x [ i ] = = false ) //未使用

         {
            x [ i ] = true ;
            sum + = a [ i ] ;
            backtrace ( i + 1 ) ;
            x [ i ] = false ;
            sum - = a [ i ] ;
             while ( i < N - & &  a [ i ] = = a [ i + 1 ] ) //跳过相同的
                i + + ;
         }
     }
}
int  main ( )
{
    sum = 0 ;
     memset ( x , 0 , sizeof ( x ) ) ;
     qsort ( a , N , sizeof ( a [ 0 ] ) , cmp ) ;
    backtrace ( 0 ) ;
     return  0 ;
}