社区
C#
帖子详情
一个组合数的递归问题
James(Wood)
2009-09-16 03:44:03
设定输入N个数 a1,a2,a3...an和一个总和 sum
列出所有可能由开始输入的N个数任意组合求和为sum的可能。
如 输入1,2,5 ,设定sum=10 则列出下面情况
5*2=10
5+2*2+1*1=10
5+2+1*3=10
2*5=10
2*4+1*2=10
2*3+1*4=10
2*2+1*6=10
2*1+1*8=10
1*10=10
...全文
158
26
打赏
收藏
一个组合数的递归问题
设定输入N个数 a1,a2,a3...an和一个总和 sum 列出所有可能由开始输入的N个数任意组合求和为sum的可能。 如 输入1,2,5 ,设定sum=10 则列出下面情况 5*2=10 5+2*2+1*1=10 5+2+1*3=10 2*5=10 2*4+1*2=10 2*3+1*4=10 2*2+1*6=10 2*1+1*8=10 1*10=10
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
26 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ncjcz
2009-09-18
打赏
举报
回复
[Quote=引用 23 楼 zh2305 的回复:]
引用 17 楼 ohyeah_dragon 的回复:
什么叫N的不确定?
SUM和an数列当然要是给定的了
比如你自己的例子 sum=10 {an}={1,2,5}
是,在每次运行时N可以确定,但你的循环如何做?
你如何去实现an后面乘的那个数循环,整个算法要处理的难点就在这
[/Quote]
去看下八皇后问题就好了
AN中每个数看做一个皇后
OhYeah_Dragon
2009-09-18
打赏
举报
回复
for(int i=0;an*i<sum;i++)
{
}
快40的码农
2009-09-18
打赏
举报
回复
穷举发,期待高手
James(Wood)
2009-09-18
打赏
举报
回复
[Quote=引用 17 楼 ohyeah_dragon 的回复:]
什么叫N的不确定?
SUM和an数列当然要是给定的了
比如你自己的例子 sum=10 {an}={1,2,5}
[/Quote]
是,在每次运行时N可以确定,但你的循环如何做?
你如何去实现an后面乘的那个数循环,整个算法要处理的难点就在这
lovelan1748
2009-09-18
打赏
举报
回复
麻烦啊
ncjcz
2009-09-18
打赏
举报
回复
[Quote=引用 20 楼 ohyeah_dragon 的回复:]
那时数据量的问题 与算法本身无关
[/Quote]
算法本身很简单,去看下八皇后问题就行了
OhYeah_Dragon
2009-09-18
打赏
举报
回复
那时数据量的问题 与算法本身无关
ncjcz
2009-09-18
打赏
举报
回复
[Quote=引用楼主 zh2305 的回复:]
设定输入N个数 a1,a2,a3...an和一个总和 sum
列出所有可能由开始输入的N个数任意组合求和为sum的可能。
如 输入1,2,5 ,设定sum=10 则列出下面情况
5*2=10
5+2*2+1*1=10
5+2+1*3=10
2*5=10
2*4+1*2=10
2*3+1*4=10
2*2+1*6=10
2*1+1*8=10
1*10=10
[/Quote]
如果SUM比较小还好,大了的话,这个计算就海了。
假设SUM=1000000,AN={1,2},那就是500000种可能
如果AN={1,2,3}
如果AN={1,2,3,100}
liaoyukun111
2009-09-18
打赏
举报
回复
对算法的挑战
OhYeah_Dragon
2009-09-18
打赏
举报
回复
什么叫N的不确定?
SUM和an数列当然要是给定的了
比如你自己的例子 sum=10 {an}={1,2,5}
James(Wood)
2009-09-18
打赏
举报
回复
[Quote=引用 12 楼 ohyeah_dragon 的回复:]
楼上的兄弟们 别乱说话 没见楼主只用了+号么?人家又没用减号 你们别误导人家啊
是有解的
举个例子 比如1 2 5 SUM=13这个
先找出最大数5 找不大于10的5的最大倍数倍数10
然后再找第二大的数的最大倍数相加 也就是2*1(乘号是指+两次,实际只能使用+号)
这时是5*2+2*1 然后取下一个大的数也就是1*1
然后5变成*1 继续取
思路就是这样
这个算法可以使用递归
假设解答为F(sum,a1,a2,...,an)
则递归为F(sum,a1..an)=F(sum-an,a1,...an-1)+F(sum-an*2,a1,..an-1)+...
代码就自己去写吧
[/Quote]
哥们,这样递归写不下去
F(sum,a1..an)=F(sum-an,a1,...an-1)+F(sum-an*2,a1,..an-1)+...
a1的乘数可以从0-sum/a1
a2的乘数可以从0-sum/a2
...
an的乘数可以从0-sum/an
整个问题的难点就在这里,因为n的不确定,我就在这不知道如何实现了
OhYeah_Dragon
2009-09-17
打赏
举报
回复
24点是加减乘除 每个数只能用一次
这个只能用加的,每隔数可以无限用
24K純帥
2009-09-17
打赏
举报
回复
这个不是和24点差不多嘛
OhYeah_Dragon
2009-09-17
打赏
举报
回复
[Quote=引用 12 楼 ohyeah_dragon 的回复:]
先找出最大数5 找不大于10的5的最大倍数倍数10
[/Quote]
错了 是不大于13
OhYeah_Dragon
2009-09-17
打赏
举报
回复
楼上的兄弟们 别乱说话 没见楼主只用了+号么?人家又没用减号 你们别误导人家啊
是有解的
举个例子 比如1 2 5 SUM=13这个
先找出最大数5 找不大于10的5的最大倍数倍数10
然后再找第二大的数的最大倍数相加 也就是2*1(乘号是指+两次,实际只能使用+号)
这时是5*2+2*1 然后取下一个大的数也就是1*1
然后5变成*1 继续取
思路就是这样
这个算法可以使用递归
假设解答为F(sum,a1,a2,...,an)
则递归为F(sum,a1..an)=F(sum-an,a1,...an-1)+F(sum-an*2,a1,..an-1)+...
代码就自己去写吧
James(Wood)
2009-09-17
打赏
举报
回复
[Quote=引用 4 楼 libinguest 的回复:]
你得告诉此算法需要做什么。
我也来写一种可能性
1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1
+
1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1
+
1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1
+
1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1
+
1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1
+5=10
此题无解!
[/Quote]
4楼你看题目中说的很明白 N个数任意组合求和 ,我举例列显示是为了简单将5+5写成5*2
enihs
2009-09-16
打赏
举报
回复
恩,应该再分析出一些潜在条件
Cherishny
2009-09-16
打赏
举报
回复
你是想想算 类似于 彩票(6/33)这种
Cherishny
2009-09-16
打赏
举报
回复
需求不明确
yudi010
2009-09-16
打赏
举报
回复
没有要求的算法,无解
比如2*5+1-1+1-1..........
加载更多回复(6)
200个经典C程序【源码】
001 第
一个
C程序 002 运行多个源文件 003 求整数之积 004 比较实数大小 005 字符的输出 006 显示变量所占字节数 007 自增/自减运算 008 数列求和 009 乘法口诀表 010 猜数字游戏 011 模拟ATM(自动柜员机...
递归
法解决简单
组合数
问题
用
递归
法计算从n个人中选择k个人组成
一个
委员会的不同
组合数
。 分析 由n个人里选k个人的
组合数
= 由n-1个人里选k个人的
组合数
+ n-1个人里选k-1个人的
组合数
从n-1个人增加到n个人,最后
一个
人可能被选中也可能不被...
递归
入门、
递归
遍历、
递归
穷举算法
本课程带你从
递归
算法基础入手,课程是精讲大量实际项目中常用到的案例,课程深入浅出,包括
递归
入门,
递归
遍历、弟归穷举算法及各种项目,适合算法爱好者一起学习,后附每堂课项目源码,感兴趣可以观注博客,不定期...
组合数
的
递归
函数
C语言,
组合数
的
递归
【c语言】
组合数
递归
已知
组合数
的
递归
定义如下所示,编写
递归
程序求Ckn (1)先写
递归
函数 (2)再写主函数 #include <stdio.h> int main(){ int seek(int k, int n); int k, n; int result; do{ printf("输入k,n(0<=k&...
C#
110,531
社区成员
642,573
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章