一个组合数的递归问题

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 打赏 收藏 转发到动态 举报
写回复
用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)

110,531

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧