急求一个排列的算法!(400分相送!!)

来源:百度知道 编辑:UC知道 时间:2024/09/21 22:53:18
给定n(n >= 1)个无重复数和一个正整数z,从这n个数中选取m个数(m >= 1,那n个数均可无限重用)组成一个序列x,使之满足:

Sx(该序列的和,即x1 + x2 + ... + xn) <= z,

每次所得到的Sx如果依次记做Sx1,Sx2,...,Sxn,并看做一个数列An的话,要求其满足:
Sx1 <= Sx2 <= .. <= Sxn,即让An呈递增数列。

求出满足条件的所有x序列。

比如给定序列2 3 5和正整数5,就有:
2
3
2 2
5
2 3
3 2
共6个序列。

与Sx相等的序列彼此可以不分先后,但要保持An递增!这样也行!
2
3
2 2
2 3
3 2
5

我想到脑残也想不出,高手大侠们快来帮帮我吧!!
不聊Q,只求一解,要源码或者思路,最好源码!

产生这样的数列可能需要使用递归,并动态分配几个数组来存放临时结果。

可以QQ聊吗 这伙我接了

网上搜来的,希望对你有帮助

void select_sort(int *x, int n)
{
int i, j, min, t;

for (i=0; i<n-1; i++)
{
min = i;
for (j=i+1; j<n; j++)
{
if (*(x+j) < *(x+min))
{
min = j;
}
}

if (min != i)
{
t = *(x+i);
*(x+i) = *(x+min);
*(x+min) = t;
}
}
}

void insert_sort(int *x, int n)
{
int i, j, t;

for (i=1; i<n; i++)
{

t=*(x+i);
for (j=i-1; j>=0 && t<*(x+j); j--)
{
*(x+j+1) = *(x+j);
}

*(x+j+1) = t;
}
}

void bubble_sort(int *x, int n)
{
int j, k, h, t;

for (h=n-1; h>0; h=k)
{
for (j=0, k=0; j<h; j++)
{
if (*(x+j) > *(x+j+1))
{
t = *(x+j);
*(x+j)