void comb(int m,int k)为找出从自然数 1、2、……、m 中任取 k 个数的所有组合。当组合的
第一个数字选定时,其后的数字是从余下的 m-1 个数中取 k-1 数的组合。这就将求 m 个数
中取 k 个数的组合问题转化成求 m-1 个数中取 k-1 个数的组合问题。设函数引入工作数组
a[ ]存放求出的组合的数字,约定函数将确定的 k 个数字组合的第一个数字放在 a[k]中,当
一个组合求出后,才将 a[ ]中的一个组合输出。第一个数可以是 m、m-1、……、k,函数
将确定组合的第一个数字放入数组后,有两种可能的选择,因还未去顶组合的其余元素,
继续递归去确定;或因已确定了组合的全部元素,输出这个组合。细节见以下程序中的函
数 comb。
【程序】
# include <stdio.h>
# define MAXN 100
int a[MAXN];
void comb(int m,int k)
{ int i,j;
for (i=m;i>=k;i--)
{ a[k]=i;
if (k>1)
comb(i-1,k-1);
else
{ for (j=a[0];j>0;j--)
printf(“%4d”,a[j]);
printf(“\n”);
}
}
}
void main()
{ a[0]=3;
comb(5,3);
}
【问题】 背包问题
问题描述:有不同价值、不同重量的物品 n 件,求从这 n 件物品中选取一部分物品的
选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。
设 n 件物品的重量分别为 w
0
、w
1
、…、w
n-1
,物品的价值分别为 v
0
、v
1
、…、v
n-1
。采
用递归寻找物品的选择方案。设前面已有了多种选择的方案,并保留了其中总价值最大的
方案于数组 option[ ],该方案的总价值存于变量 maxv。当前正在考察新方案,其物品选择
情况保存于数组 cop[ ]。假定当前方案已考虑了前 i-1 件物品,现在要考虑第 i 件物品;当
前方案已包含的物品的重量之和为 tw;至此,若其余物品都选择是可能的话,本方案能达
到的总价值的期望值为 tv。算法引入 tv 是当一旦当前方案的总价值的期望值也小于前面方
案的总价值 maxv 时,继续考察当前方案变成无意义的工作,应终止当前方案,立即去考
察下一个方案。因为当方案的总价值不比 maxv 大时,该方案不会被再考察,这同时保证
函数后找到的方案一定会比前面的方案更好。
对于第 i 件物品的选择考虑有两种可能: