正在加载图片...
int p=0 t= ttl - max if (max = ttl return if(t < max) while(m >= 1) return p max p += pks(t, max--) return p: 8.21设m,n均为自然数,m可表示为一些不超过n的自然数之和,函数fun(m,n)的 值为这种表示方式的数目。例fun(5,3)=5,有5种表示方式:3+2,3+1+1,2+2+1,2+1+1+1 1+1+1+1+1。用递归函数实现其功能。 算法分析:本题与8.20题的区别就是被分解的数字不能大于n #include <stdio. h int fun (int, int) int maino nt a a fun(6, 4 printf("a = %d\n", a) int fun (int m, int n (m = 1) return 1 if(n 1) return 1: if(m n) return fun(m, m) if(m = n) return (1 fun(m, n-1)) return(fun(m, n-1)+fun(mn, n)) 8.22设有n个正整数元素的集合存放于数组a中,每个数组元素中存放一个集合元素 对给定的整数k(a[i]<k,i=1,2,…,n),求满足所给条件的子集:子集中各元素之和等于k 算法分析:此问题称为“子集和问题”。求解时利用数组S作为栈,栈中最终存放所求 子集各元素在a中的序号(下标)。 #include <stdio. h #define n 6 #define k 30 int total void printsubset(int a[, int s[, int sp)8 { int p = 0; int m = t = ttl - max; if(max == ttl) return 1; if(t <= max) { while(m >= 1) p += pks(t,m--); return p; } while(max >= 1) p += pks(t,max--); return p; } 8.21 设 m,n 均为自然数,m 可表示为一些不超过 n 的自然数之和,函数 fun(m,n)的 值为这种表示方式的数目。例 fun(5,3)=5,有 5 种表示方式:3+2,3+1+1,2+2+1,2+1+1+1, 1+1+1+1+1。用递归函数实现其功能。 算法分析:本题与 8.20 题的区别就是被分解的数字不能大于 n。 #include <stdio.h> int fun(int,int); int main() { int a; a = fun(6,4); printf("a = %d\n",a); } int fun(int m,int n) { if(m == 1) return 1; if(n == 1) return 1; if(m < n) return fun(m,m); if(m == n) return(1 + fun(m,n-1)); return(fun(m,n-1) + fun(m-n, n)); } 8.22 设有 n 个正整数元素的集合存放于数组 a 中,每个数组元素中存放一个集合元素。 对给定的整数 k(a[i]<k,i=1,2, …,n),求满足所给条件的子集:子集中各元素之和等于 k。 算法分析:此问题称为“子集和问题”。求解时利用数组 S 作为栈,栈中最终存放所求 子集各元素在 a 中的序号(下标)。 #include <stdio.h> #define N 6 #define K 30 int total; void printsubset(int a[],int s[],int sp)
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有