一. 产生集合的全排列
# 集合全排列
def Perm(list, head, tail):
# 递归出口,构成一次全排列,输出
if head == tail:
for i in range(tail+1):
print(list[i], end=" ")
print()
# 产生head到tail的全排列
else:
for j in range(head, tail+1):
list[head], list[j] = list[j], list[head]
# 进行后面的全排列
Perm(list, head+1, tail)
# 全排列以后要恢复之前的顺序,方便下次进行排列的交换位置
list[head], list[j] = list[j], list[head]
if __name__ == '__main__':
list = [1,2,3,4,5,6]
Perm(list, 0, 2) # 产生1到3的排列
二.整数划分
using namespace std;
// 集合全排列
int split(int n,int m){
if(n==1||m==1) return 1;
else if(n<m) return split(n,n);
else if(n==m) return split(n,n-1) + 1;
else return split(n,m-1) + split(n-m,m);
}
int main()
{
cout << split(6,4);
}
def split(num, max_sum):
if num == 1 and max_sum == 1:
return 1 # 都是1的时候只有一种
elif num < max_sum:
return split(num, num) # 最大加数不能超过自己
elif num == max_sum:
return split(num, num - 1) + 1 # 都相等的话,就是1加上退回一位的划分
else:
return split(num, max_sum - 1) + split(num - max_sum, max_sum) # 最大加数是max_sum,说明这个划分式的头已经确定是max_sum,我们只要划分后面的式子就行了
if __name__ == '__main__':
print(split(2, 2))