/**************************************************************************
49. 有面值为 M..N 的邮票各一枚,共能拼出多少不同的面额。
*************************************************************************/
#include <stdio.h>
#define N 6
//各种面值的使用情况
int uses_status[N];
//面值
int par_value[N] = {1,2,3,4,5,6};
//各种组合面值
int comb_value[64];
//组合面值数
int counter = 0;
int find(int sum)
{
int i;
for(i=0; i<counter; i++)
{
if(comb_value[i] == sum)
return 1;
}
return 0;
}
void combine(int k)
{
if(k == N)
{
int i,sum=0;
for(i=0; i<N; i++)
{
if(uses_status[i])
{
sum += par_value[i];
}
}
if(!find(sum))
{
comb_value[counter++] = sum;
printf("%d/n",sum);
}
}
else
{
//分治
uses_status[k] = 1;//有该面值
combine(k+1);
uses_status[k] = 0;//没有该面值
combine(k+1);
}
}
void main()
{
combine(0);
printf("一共有%d种面额!/n",counter);
}