漂亮的算法
[2011.3.6]1块,3块,5块,20块, 6个,3个,7个,4个, 凑25,12,8,35,50, 每个只能用4个来凑.
要点:1. 成功判断 + 输出函数 2. 每个函数处理单层 + 传参层进 3. 有一些需要层进的参数,需要设为函数参数。
int value[4] = {1, 3, 5, 20};
int num[4] = {6, 3, 7, 4};
int des[5] = {25,12,8,35,50};
int result[5][4]= {0};
int out()
{
printf("结果:");
for (int i=0; i< 5; i++)
{
printf("%d:", des[i]);
for(int j= 0; j< 4; j++)printf("%d ", result[i][j]);
printf("\n");
}
printf("\n");
return true;
}
int success()
{
int temp;
for (int i=0; i< 5; i++)
{
temp = 0;
for(int j= 0; j< 4; j++)
temp += result[i][j];
if(temp != des[i])return false;
}
return true;
}
int group_success(int group)
{
int temp=0;
for(int j= 0; j< 4; j++)
temp += result[group][j];
if(temp != des[group])
return false;
return true;
}
int huisu(int group, int num_i, int used)
{
if(num_i == 4 && success())return out();
if(num_i == 4)
if(group_success(group))
huisu(++group, 0, 0);
else
return 0;
for(int use= used; use< 4; use++)
{
if(num[use] == 0)continue;
num[use]--;
result[group][num_i] = value[use];
huisu(group, num_i+1, use);
result[group][num_i] = 0;
num[use]++;
}
}
[2011.1.1] 字典树
do_travel(struct trie_node_st *rootp)
{
static char worddump[WORDLENMAX+1];
static int pos=0;
int i;
if (rootp == NULL) {
return 0;
}
if (rootp->count) {
worddump[pos]='\0';
printword(worddump, rootp->count);
}
for (i=0;i<TREE_WIDTH;++i) {
worddump[pos++]=i;
do_travel(rootp->next[i]);
pos--;
}
return 0;
}