漂亮的算法

[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;
}

posted on 2011-03-06 13:34  oleeceo  阅读(222)  评论(0)    收藏  举报

导航