答案提供代码~~
程序代码:
#include <cstdio>
using namespace std;
int sum = 0;
char str[100];
int Fun(int now, int i, int a, int b)
{
if(now < 0 || i > 16 || (now == 0 && i < 16))
return 0;
if(now == 0)
{
if(i == 16 && a == 5 && b == 10)
{
sum++;
for(int j = 0; j < 15; j++)
putchar(str[j]);
putchar(10);
}
}
str[i - 1] = 'a';
Fun(now * 2, i + 1, a + 1, b);
str[i - 1] = 'b';
Fun(now - 1, i + 1, a, b + 1);
}
int main()
{
str[15] = '\0';
Fun(2, 1, 0, 0);
printf("sum = %d\n", sum);
return 0;
}
自己思考的~重点是总共5次买了8壶酒~
标记第N次遇见店时的酒数目~
这样剪枝效率就高很多了~
注意a1<=2;
a(n+1)<=an*2;
手工得出结果是14~
1--8=1+1+1+2+3;
2--8=1+1+2+1+2;
3--8=1+1+2+2+1;
4--8=1+2+1+2+2;
5--8=1+2+2+1+2;
6--8=1+2+2+2+1;
7--8=1+2+3+1+1;
8--8=2+1+1+2+2;
9--8=2+1+2+1+2;
10--8=2+1+2+2+1;
11--8=2+2+1+1+2;
12--8=2+2+1+2+1;
13--8=2+2+2+1+1;
14--8=2+3+1+1+1;
~
[此贴子已经被作者于2017-10-13 04:19编辑过]