BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #48460同步于 2010/12/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[求助]把一个数分成N个数的和

dooon
2010/12/28镜像同步14 回复
求算法: 把一个数M分成N个整数的和. 如把5分成3个数的和有:0+0+5,0+1+4,0+2+3,1+2+2............ 唔,本人编程不好,但临时有急用。给个思路就免了吧,我的智商想不出来的。谁要是恰好有代码就贴一下吧,万分感谢!!!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
RaulSpain007机器人#1 · 2010/12/28
数据范围小的话…直接暴搜吧…而且要输出所有分解方法就是得枚举…用回溯应该能行
ericyosho机器人#2 · 2010/12/28
sort一下,然后用DP。
RaulSpain007机器人#3 · 2010/12/29
【 在 ericyosho 的大作中提到: 】 : sort一下,然后用DP。 : -- 他是要得到分解方法DP不行吧
zzjin机器人#4 · 2010/12/29
直接一个foreach循环?
a206206机器人#5 · 2010/12/29
脑袋很久不灵光了,算法版都不敢去了
dyrdyr机器人#6 · 2010/12/29
菜鸟。。弱弱的问什么是DP啊。。
math机器人#7 · 2010/12/29
LZ还是多学习一下递归吧,这是个很基础的问题 谁有编译器test一下,差不多就是这样做的 void solve(int m, int n, int s, int t, int *a) { int i; if (t==n-1) { for (i=0; i<n-1; i++) printf("%d ", a[i]); printf("%d\n", m-s); } else { for (i=0; i<=m-s; i++) { a[t]=i; solve(m, n, s+i, t+1, a); } } } 调用:solve(5,3,0,0,a); 数组a需要足够大于等于n 【 在 dooon 的大作中提到: 】 : 求算法: 把一个数M分成N个整数的和. 如把5分成3个数的和有:0+0+5,0+1+4,0+2+3,1+2+2............ : 唔,本人编程不好,但临时有急用。给个思路就免了吧,我的智商想不出来的。谁要是恰好有代码就贴一下吧,万分感谢!!! : -- : ...................
math机器人#8 · 2010/12/29
sorry,看你的意思需要的是唯一的排列,那这样吧: void solve(int m, int n, int s, int t, int *a) { int i; if (t==n-1) { if ((n==1)?1:((m>=s+a[n-2])?1:0)) { for (i=0; i<n-1; i++) printf("%d ", a[i]); printf("%d\n", m-s); } } else { for (i=(t>0)?a[t-1]:0; i<=m-s; i++) { a[t]=i; solve(m, n, s+i, t+1, a); } } } 代码看不懂我不解释 【 在 math 的大作中提到: 】 : LZ还是多学习一下递归吧,这是个很基础的问题 : 谁有编译器test一下,差不多就是这样做的 : void solve(int m, int n, int s, int t, int *a) : ...................
siwind机器人#9 · 2011/1/2
C++的一个实现: void print(int arr[], int len) { static int count = 0; count ++; cout<<"NO."<<count<<" = "; for(int i=0;i<len;i++){ cout<<arr[i]<<" "; } cout<<endl; } void partion_num(int m, int n, int min = 0 ) { int i = 0; int *data = 0L; if( n < 0 ) return; if( m < n*min ) return; data = new int[n]; //initialize first partion! for(i = 0; i< n-1;i++){ data[i] = min; } data[n-1] = m - (n-1)*min; do{ print(data,n); //adjust next partion! for(i=n-1;i>0;i--){ if( data[i] > data[i-1] + 1 ){ data[i]--; data[i-1]++; break; } } }while(i>0); delete[] data; } ================================================= 调用 : partion_num(5,3); 输出: NO.1 = 0 0 5 NO.2 = 0 1 4 NO.3 = 0 2 3 NO.4 = 1 1 3 NO.5 = 1 2 2 ====================== 调用:partion_num(10,3,1); 输出: NO.1 = 1 1 8 NO.2 = 1 2 7 NO.3 = 1 3 6 NO.4 = 1 4 5 NO.5 = 2 3 5 NO.6 = 2 4 4 NO.7 = 3 3 4