C程序设计的抽象思维-递归过程-砝码称重

【问题】

在狄更斯时代,商人们用砝码和天平来称量商品的重量,假设你仅仅有几个砝码,就仅仅能精确地称出一定的重量。比如,假定仅仅有两个砝码:各自是1kg和3kg。

仅仅用1kg的砝码能够称出1kg重量的商品,仅仅用3kg的砝码能够称出3kg重量的商品。

1kg和3kg的砝码放在天平同一边能够称出4kg重量的商品,放在不同边能够称出2kg重量的商品。

因此利用这两个砝码。我们能够称出重量分别为1、2、3、4kg的商品。

编写一个递归函数:

bool IsMeasurable(int target, int weights[], int nWeights)

用来确定用一组给定的砝码是否能称量指定的重量。

可用的砝码用数组weights表示,nWeights表示砝码的个数。

比如前面所讲的两个砝码的演示样例能够使用例如以下的变量表示:

static int sampleWeights[] = {1, 3};

static int nSampleWeights = 2;

给定之后,调用函数:

IsMeasurable(2, sampleWeights, nSampleWeights)

将返回TRUE。由于1kg和3kg的两个砝码可以称出2kg重量的商品。

假设调用函数:

IsMeasurable(5, sampleWeights, nSampleWeights)

将返回FALSE, 由于不能用重1kg和3kg的砝码称5kg的商品。

【分析】

对这个问题最主要的考虑是能按下面方式中的不论什么一种使用每个砝码:

1. 能把它放在天平上与商品不同的一边

2. 能把它放在天平上与商品同样的一边

3. 能把它移离天平

假设选定砝码组中的一个砝码,并知道怎样使用这三个选项中之中的一个来处理后面的问题,那么就能提出解决问题所需的递归思想。

【代码】

#include <stdio.h>
#include <stdlib.h> typedef enum{false, true}bool; bool IsMeasurable(int target, int weights[], int nWeights)
{
if(nWeights == 0)
{
if( 0 == target)
return true;
else
return false;
}else{
bool a, b ,c;
a = IsMeasurable(target, weights, nWeights -1);//将砝码移除
b = IsMeasurable(target + weights[nWeights- 1], weights, nWeights - 1);//将砝码放在商品同一边
c = IsMeasurable(target - weights[nWeights - 1], weights, nWeights - 1);//将砝码放在商品不同边
return (a || b || c);
}
} int main()
{
int sampleWeights[] = {1, 3, 5, 7, 10};
int nSampleWeights = 5;
bool result;
result = IsMeasurable(50, sampleWeights, nSampleWeights);
if(result)
printf("TRUE\n");
else
printf("FALSE\n");
}
上一篇:pyqt QTreeWidget例子学习


下一篇:Gadgets for dollars and pounds CodeForces - 609D