主题:急求数据结构的问题,哪位大虾想来挑战一下
旧时代的金属
[专家分:0] 发布于 2006-06-22 00:42:00
123456789=100
在前面添加“+”或者“-”使等式满足
要求时间复杂度最小
求救了~~~~~~~~~~
回复列表 (共5个回复)
沙发
旧时代的金属 [专家分:0] 发布于 2006-06-22 12:25:00
大家帮忙解答一下啊
后天就要验收了
好急~~~~~~~~
板凳
旧时代的金属 [专家分:0] 发布于 2006-06-22 20:09:00
有人会不???
3 楼
euc [专家分:4310] 发布于 2006-06-25 17:50:00
运行一下看看:)
方法是把所有的符号组合都试一下,一共3^9=19683次,复杂度最高的那种吧。这个是用opt[]数组表示的符号组合,0表示无符号,1减,2加。比如说opt[]={0,0,0,2,1,2,0,1,0},就表示123+4-5+67-89。
如何遍历所有的符号组合呢?是把它看成9位的3进制数,每次加1,一共加19683次就行了。
#include <stdio.h>
char num[9] = {1,2,3,4,5,6,7,8,9};
char opt[9];
void addone (void)
{
int i;
for (i = 1; i < 9; ++i)
if (++opt[i] >= 3)
opt[i] = 0;
else break;
}
void showopt (void)
{
int i;
for (i = 0; i < 9; ++i)
printf ("%d", opt[i]);
printf ("\n");
}
int compute (void)
{
static char opstk[10];
static long numstk[10];
int top = 0, i;
long n = 0, n2;
for (i = 0; i < 9; ++i) {
if (opt[i] == 0) {
n *= 10;
n += (long)num[i];
}
else {
numstk[top] = n;
opstk[top] = opt[i];
top++;
n = num[i];
}
}
n2 = n;
numstk[top] = n;
n = numstk[0];
for (i = 0; i < top; ++i) {
if (opstk[i] == 1)
n -= numstk[i+1];
else
n += numstk[i+1];
}
if (n == 100) {
for (i = 0; i < top; ++i) {
printf ("%d", numstk[i]);
if (opstk[i] == 1)
printf ("-");
else printf ("+");
}
printf ("%d=100\n", n2);
showopt ();
return 1;
}
else return 0;
}
int main (void)
{
int i;
for (i = 0; i < 19683; ++i) {
compute ();
addone ();
}
return 0;
}
4 楼
euc [专家分:4310] 发布于 2006-06-25 17:51:00
这里是所有的结果:
123+4-5+67-89=100
000212010
123-45-67+89=100
000101020
12+3+4+5-6-7+89=100
002221120
12-3-4+5-6+7+89=100
001121220
1+23-4+5+6+78-9=100
020122201
123+45-67+8-9=100
000201021
123-4-5-6-7+8-9=100
000111121
1+2+3-4+5+6+78+9=100
022122202
1+2+34-5+67-8+9=100
022012012
12+3-4+5+67+8+9=100
002122022
1+23-4+56+7+8+9=100
020120222
123+4-5+67-89=100
000212010
123-45-67+89=100
000101020
12+3+4+5-6-7+89=100
002221120
12-3-4+5-6+7+89=100
001121220
1+23-4+5+6+78-9=100
020122201
123+45-67+8-9=100
000201021
123-4-5-6-7+8-9=100
000111121
1+2+3-4+5+6+78+9=100
022122202
1+2+34-5+67-8+9=100
022012012
12+3-4+5+67+8+9=100
002122022
1+23-4+56+7+8+9=100
020120222
123+4-5+67-89=100
000212010
123-45-67+89=100
000101020
12+3+4+5-6-7+89=100
002221120
12-3-4+5-6+7+89=100
001121220
1+23-4+5+6+78-9=100
020122201
123+45-67+8-9=100
000201021
123-4-5-6-7+8-9=100
000111121
1+2+3-4+5+6+78+9=100
022122202
1+2+34-5+67-8+9=100
022012012
12+3-4+5+67+8+9=100
002122022
1+23-4+56+7+8+9=100
020120222
5 楼
euc [专家分:4310] 发布于 2006-06-25 20:27:00
不好意思,应该是8位的3进制数~~ 19683改成6561。可以看到结果都重复了,应该只有11个解。
我来回复