有4种面值的邮票很多枚,这4种邮票面值分别1, 4, 12, 21,现从多张中最多任取5张进行组合,求取出这些邮票的最大连续组合值。(据说是华为2003年校园招聘笔试题)
#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=%dnn”, 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);
}