思路一:利用全排列进行枚举
#include<cstdio>
#include<algorithm>
using namespace std;
char a[] = "aaaaabbbbbbbbbb";
int main()
{
int ans = 0;
do{
int jiu = 2;
if(a[14] != 'b')
continue;
for(int i = 0; i < 15; ++i){
if(a[i] == 'a') jiu *= 2;
if(a[i] == 'b') jiu -= 1;
}
if(!jiu)
++ans;
}while(next_permutation(a,a+15));//这里有可以直接列举到 第14个 因为最后一定是花
printf("%d",ans) ;
return 0;
}
思路二:dfs 1
#include<stdio.h>
int ans;
char a[20];
void dfs(int dian,int hua,int jiu,int s)
{
// if(dian < 0 || hua < 0 || jiu < 0)
// return ;
if(!dian && !hua && !jiu && a[14] == 'b')//这里 注意 最后一定是花
++ans;
if(dian > 0){
a[s] = 'a';
dfs(dian-1,hua,jiu*2,s+1);
}
if(hua > 0){
a[s] = 'b';
dfs(dian,hua-1,jiu-1,s+1);
}
}
int main()
{
int jiu = 2;
ans = 0;
dfs(5,10,2,0);
printf("%d\n",ans);
return 0;
}
最后必须是花 ,但是不能最后结果酒是0就可以了 例如 在某一位置为花 此时酒为0 在其之后遇到的全是店 这个
也是满足 dfs条件 ans会加的 但是 不满足题意。
思路3:dfs 2
#include<stdio.h>
int a[20];
int ans;
void dfs(int pos, int sum, int type)
{
if(sum < 0)
return ;
a[pos] = type;
if(pos == 15){
if(type != 1)
return ;
if(sum == 0){
int dian = 0;
int hua = 0;
for(int i = 1; i <= 15; ++i){
if(a[i] == 0) ++dian;
else if(a[i] == 1) ++hua;
}
if(dian == 5 && hua == 10)
++ans;
}
return ;
}
dfs(pos+1,sum-1,1);
dfs(pos+1,2*sum,0);
}
int main()
{
for(int i = 0; i < 20; ++i)
a[i] = -1;
ans = 0;
dfs(0,2,0);//这是 第0次 type可以 取0或1 不影响结果
//dfs(0,2,1);//不可以 再次尝试 type = 1 否则结果翻倍
printf("%d\n",ans);
return 0;
}
这里 按照从1开始,对15个位置进行判断 注意 因为 是从0(无效位置)开始 所以 0位置的type 等于0 或者1 都不影响结果