//有4种面值的邮票很多枚,这4种邮票面值分别1, 4, 12, 21,取5张 求取出这些邮票的最大连续组合值。
#include <stdio.h>
#include <string.h>
#define N 5
#define M 5
int k, Found, Flag[N];
int Stamp[M] = {0, 1, 4, 12, 21};
// 在剩余张数n中组合出面值和Value
int Combine(int n, int Value)
{
if(n >= 0 && Value == 0)
{
Found = 1;
int Sum = 0;
for(int i=0; i<N && Flag[i] != 0; i++)
{
Sum += Stamp[Flag[i]];
printf("%d ", Stamp[Flag[i]]);
}
printf("\tSum=%d\n\n", Sum);
}
else
for(int i=1; i<M && !Found && n>0; i++)
if(Value-Stamp[i] >= 0)
{
Flag[k++] = i;
Combine(n-1, Value-Stamp[i]);
Flag[--k] = 0;
}
return Found;
}
int main(int argc, char* argv[])
{
for(int i=1; Combine(N, i); i++, Found=0);
}
看题目的意思是:能够组合成的连续的数值最大是多少。比如说可以组成1、2、3、4、5……找出最大的那个值。如果最大数是60,那么59也必须可以组合出来。