回 帖 发 新 帖 刷新版面

主题:[讨论]一个算法问题 谁能做?

25.40   48.80   339  144  257  339.10   113.40  50.90
273.40  327.70  133.40  69.20  116  167.80  100.9  224.3  202.70  190  230.90  286.80  162.60  92.70  120.30  260.50  67.90  249.90  62.50 

以上数字自由组合,但不能重复用使用,列出三个加法算式使其能得出1122.30、2001.50、1533.30

回复列表 (共7个回复)

沙发

没人挑战吗

板凳

升序排序,依次往上加,<继续,=输出一个结果,>指定的值就 跳到下一个数

3 楼

哈哈, 很笨的方法就是设几重循环,都测试一下,
     可能有较好的方法, 没想到!

4 楼

3楼怎么行

5 楼


这个似乎是0-1背包dp问题啊

呵呵  用递归最方便的啦

6 楼

先说一个粗糙的算法:
  构造一课深度为4的n叉树。用回溯法遍历。
可以先进行排序,这样可以构造出一个回溯条件。满足目标的的叶节点的路径可以判断出组合里的所有元素。
或者三个循环嵌套:
a[n];  b[n][3];
sum;  m=0;
for(i=0,i<n,i++)
{b[m][0]=a[i];
for(j=i+1,j<n,j++)
{b[m][1]=a[j];
for(k=j+1,k<n,k++)
{b[m][2]=a[k];
if(b[m][0]+b[m][1]+b[m][2]==sum)
{m++;break}

}
}
}

7 楼

请问你“组合”的意义

我来回复

您尚未登录,请登录后再回复。点此登录或注册