使用的是递归算法,地址:http://acm.pku.edu.cn/JudgeOnline/problem?id=1564
#include <stdio.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <stdlib.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int cmp ( const void *a, const void *b )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return *( int * )b - *( int * )a;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int n;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int num[15];
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int stack[15];
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int flag;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void print ( int len, int s, int last )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int fa = -1;
for ( int i=s; i<n; i++ )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if ( last - num[i] == 0 && num[i] != fa )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
stack[len] = num[i];
for ( int i=0; i<len; i++ )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
printf ( "%d+", stack[i] );
}
printf ( "%d\n", stack[i] );
flag = 1;
}
else
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if ( last - num[i] > 0 && num[i] != fa )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
stack[len] = num[i];
print ( len+1, i+1, last-num[i] );
}
}
fa = num[i];
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int main ()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
int t;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
while ( scanf ( "%d%d", &t, &n ) != EOF && ( t || n ) )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
for ( int i=0; i<n; i++ )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
scanf ( "%d", &num[i] );
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
qsort ( num, n, sizeof ( int ), cmp );
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
flag = 0;
printf ( "Sums of %d:\n", t );
print ( 0, 0, t );
if ( ! flag )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
printf ( "NONE\n" );
}
}
return 0;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)