以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 算法理论与分析 』 (http://bbs.xml.org.cn/list.asp?boardid=60) ---- 一个很难的数学算法大家进来帮帮小妹啊很急 (http://bbs.xml.org.cn/dispbbs.asp?boardid=60&rootid=&id=23227) |
-- 作者:waterzhouliu -- 发布时间:10/18/2005 9:48:00 AM -- 一个很难的数学算法大家进来帮帮小妹啊很急 set 20>m>=n>0, exp: input m=8, input n=4. 有多少组4个数加起来等于8的 很急呀 |
-- 作者:binaryluo -- 发布时间:10/18/2005 11:58:00 AM -- 感觉有点类似24点。 |
-- 作者:waterzhouliu -- 发布时间:10/18/2005 12:01:00 PM -- 帮帮小妹有人能写出来吗 |
-- 作者:binaryluo -- 发布时间:10/18/2005 12:04:00 PM -- 24点你可以参考下这里: http://www.ieee.org.cn/dispbbs.asp?boardID=60&ID=15720 |
-- 作者:waterzhouliu -- 发布时间:10/18/2005 12:07:00 PM -- 但是M N都是动态的,是用户自己输入的呀 |
-- 作者:binaryluo -- 发布时间:10/18/2005 12:11:00 PM -- 那篇文章里的算法是根据24点扩展出来了一个算法,他里面的牌数和点数也是动态的。 |
-- 作者:waterzhouliu -- 发布时间:10/18/2005 12:30:00 PM -- 不是的哦,看不明白 |
-- 作者:waterzhouliu -- 发布时间:10/18/2005 12:35:00 PM -- 谁能把具体的算法给我么? |
-- 作者:binaryluo -- 发布时间:10/19/2005 11:33:00 AM -- 帮你想下。。。 |
-- 作者:galois -- 发布时间:10/22/2005 6:11:00 PM -- 应该是很简单的组合算法吧 |
-- 作者:galois -- 发布时间:10/22/2005 6:13:00 PM -- 相当于:8个不编号的球放入4个不编号的盒子,有几种放法咯。 用动态规划可以解吧。就不知道最好的解法是什么。 |
-- 作者:xxzzxx -- 发布时间:10/26/2005 6:10:00 PM -- import java.util.* class Combines |
-- 作者:xzjxu -- 发布时间:10/27/2005 2:20:00 PM -- 楼上,不用那么复杂吧! 我给一个VB写的程序: Private Sub Command1_Click() Dim a() As String, k As Integer Dim m As Integer, n As Integer m = Val(Text1) n = Val(Text2) k = com(m, n, a) Text3 = k For i = 1 To k List1.AddItem a(i) Next i End Sub Private Function com(m As Integer, n As Integer, a() As String) As Integer |
-- 作者:snail -- 发布时间:11/18/2005 10:00:00 AM -- 不晓得楼主要的是不这样,最笨的算法更好的还在想之中. main() { int i,j,k,l,sum,id; id=0; for(i=1;i<8;i++) { sum=0; for(j=0;j<8;j++) for(k=0;k<8;k++) for(l=0;l<8;l++) { sum=i+j+k+l; if(sum==8) id+=1; } } id=id+1; printf("the number is:%d",id); } |
-- 作者:enorm -- 发布时间:12/1/2005 8:53:00 PM -- /*by enorm*/ #include "stdio.h" int cont [21]; void cal(int m,int n,int num) { if(m>20||n>20||n<=0||m<=0) return; } } c语言精炼,呵呵
[此贴子已经被作者于2005-12-1 22:13:42编辑过]
|
-- 作者:dolphin_lzy -- 发布时间:1/8/2006 1:30:00 PM -- 能把规则在详细的说明一下吗?比如产生的只能是1-9数字吗?算法实现好象不是很难啊?可能效率很重要了吧? |
-- 作者:wcdxyl -- 发布时间:3/22/2006 4:04:00 PM -- package ieee; public class Composite { public void getComposite(int a, int b) { int n = 0; for (double i = Math.pow(10, b - 1); i < Math.pow(10, b) - 1; i++) { for (int j = 0; j < itos.length(); j++) { /** } |
-- 作者:bj15828 -- 发布时间:3/26/2006 11:27:00 PM -- 我大概写些思想和伪代码: 设m=8 ,n=4.按要求说我们可以理解为一个n层的树,只要树遍历到了,那么解也就出来了.那么树是怎么构造呢? 首先来看究竟m,n和树的层中元素有什么关系?m=8,n=4,也就是说位于第一层的元素必然满足这么一个关系:m-n+1,也就是说第一层最多可为5个元素,分别是5,4,3,2,1,第二层的构造是按照第一层中每个元素分别来构造,对于元素1来说,它的第二层元素为1,2,3,4,5;元素2为1,2,3,4.满足下面的关系式: 单个元素的下一层对应的元素个数 = m-当前层数-n+当前总值 当前总值=遍历经过的元素值之和 有了上面的公式,用栈来实现遍历. /* while((m-n+1)>0) |
-- 作者:cll121 -- 发布时间:3/29/2006 10:35:00 AM -- 真深奥啊我看不懂啊 |
-- 作者:dhxu757 -- 发布时间:4/18/2006 9:58:00 PM -- #include <math.h> #include <conio.h> int main(]) scanf("%d, %d", &n, &m); maxit = (unsigned long)pow(10.0, n); for ( it = minit; it < maxit; it++ ) printf("\nCount = %d", count); getch(); return 0; |
-- 作者:dhxu757 -- 发布时间:4/18/2006 10:03:00 PM -- 一个很简单的问题, 可以不要涉及到高深的算法即可求解.我的程序在楼上.请大家指正. |
-- 作者:yibical -- 发布时间:4/29/2006 10:44:00 AM -- 算法我想出来了,可以和我联系QQ:401350842 |
-- 作者:tomlillite -- 发布时间:5/9/2006 10:56:00 AM -- #include<iostream.h> void main() {int n; cout<<"请输入要分解的数据:"<<endl; cin>>n; int a,b,c,d; for(a=1;a<n;a++) {for(b=a;b<n;b++) {for(c=b;c<n;c++) {for(d=c;d<n;d++) {if(a+b+c+d==n&&a<=b&&b<=c&&c<=d) cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl; } } } } } |
-- 作者:wanghuicn2008 -- 发布时间:7/1/2006 4:58:00 PM -- 组合数学中的母函数可解这个问题,具体看《组合数学及算法》中科大出的 |
-- 作者:binaryluo -- 发布时间:7/2/2006 11:23:00 AM -- 看了大家写的程序实现,作了个总结。 解决方法大致可以分为以下两种思路: 2.将结果的数串以一个整体(大整数)考虑,先设置好循环的范围,然后再在该范围内测试这些大整数的各个数位取出来相加,看结果是否是正确解。例如m=8,n=4,意思是找出4个数字相加的结果是8的全部组合。用方法2的思想,他的处理思路是,4个数字如果组成一个大整数的话,范围是1000-9999之间,即10^3到10^4之间,所以原题可以考虑成在1000-9999之间找出各个数位加起来是8的全部数字。取各个数位的时候采用了模10的方法。 可以证明两算法的时间复杂度满足如下关系: 在分析过程中略去了有些朋友的解法,在此表示歉意。另外,由于个人水品有限,在分析过程中如果有错误的地方还望大家指正。 |
-- 作者:richardxx -- 发布时间:8/24/2006 11:11:00 AM -- #include <stdio.h> int f(int m,int n) int main()
|
-- 作者:richardxx -- 发布时间:8/24/2006 11:15:00 AM -- 以上的程序直接利用关系式: f(m,n)=sum{[i=1 to min(m-n,n)] f(m-n,i)} |
-- 作者:dvdface -- 发布时间:10/24/2008 5:16:00 PM -- 这不就是枚举么? 为什么难啊? 还可以用减枝法来减少计算量. |
-- 作者:richardxx -- 发布时间:10/24/2008 5:22:00 PM --
汗,枚举,人家要的是DP解。。。 |
-- 作者:dvdface -- 发布时间:10/24/2008 6:42:00 PM -- 有道理, 用DP可以更加减少计算量. 就是实现麻烦点. 要存储 子问题的 解. 不错 |
-- 作者:kid1986 -- 发布时间:10/25/2008 2:05:00 PM -- #include <stdio.h> main() { int i,j,k,l,sum,id; id=0; for(i=1;i<8;i++) { sum=8; for(j=1;j<8;j++) for(k=1;k<8;k++)//外层循环没什么好解释的就一个算吧 { l=sum-i-j-k;//最后一层循环没必要了改成直接看l是否存在就可以减少了时间复杂度,不知道能接受不 if(l>0) { id=id+1; printf("%d+%d+%d+%d=%d\n%d\n",i,j,k,l,sum,id); } continue; } } } 14楼友的改版 |
-- 作者:hust512 -- 发布时间:2/26/2009 11:40:00 PM -- 哈哈,很早的贴嘛! 不久两层for循环就解决了吗! 当局者迷呀! |
-- 作者:computernewuser44 -- 发布时间:3/11/2009 11:29:00 PM -- 这是组合数学中的“拆分数”,必须用生成函数。 ∑(上限:∞)(下限:n=0)pn(下标:n)Xn(n次方)=∏(上限:∞)(下限:k=0)(1-Xk(k次方))-1(-1次方); 用级数展开Xn(n次方)系数pn为拆分数。 由于有文字不好写“n次方”“累加,累乘”原谅。 |
-- 作者:computernewuser44 -- 发布时间:3/11/2009 11:32:00 PM -- 具体实现见《组合数学的算法与程序设计》好像是作者吴文虎。 |
-- 作者:ZaakDov -- 发布时间:6/5/2009 6:28:00 PM -- dp[n,m]=dp[n-1][m-1]+dp[n-m][m] dp[n][n]=1; 如此DP 时间O(n*n) |
-- 作者:fairywell -- 发布时间:3/10/2010 11:15:00 AM -- 粗看,我觉得笨方法可以用暴力+pruning,聪明点可以从8的整数分解开始反过来解决 |
-- 作者:jsjkxlt99 -- 发布时间:4/13/2010 1:02:00 AM -- log 假设语言选取是自由的。 由于 8 <= 20. 所以要求均为正数时就是4-1=3个1,8-4=4个0的全组合。用prolog 很容易生成。 (一般x1+x2+x3+ ...+ xn = r, 要求xi >=0时就是组合数C(n+r-1,r)) 在有上界限制时,比如 m >= xi >=0,而m < r,则可以用mathematica和生成多项式,
|
-- 作者:蹩脚的黑客 -- 发布时间:10/7/2010 10:49:00 PM -- int main(int argc, char* argv[]) { int i,j,k,l; int m; for(i=1;i<20;i++) for(j=19;j>=i;j--) for(k=19;k>=i&&k>=j;k--) for(l=19;l>=i&&l>=j&&l>=k;l--) {m=i+j+k+l; if(m==8) printf("%d %d %d %d\n",i,j,k,l); continue; } }
|
-- 作者:huiru -- 发布时间:10/18/2010 2:32:00 PM -- fsd 不是很清楚哈,也许是太难了,再继续找找看,看有没有别的什么答案没哦。 [url=http://www.eluxurys-store.com/prada.html]prada[/url] |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
281.250ms |