【问题】
在狄更斯时代,商人们用砝码和天平来称量商品的重量,如果你只有几个砝码,就只能精确地称出一定的重量。例如,假定只有两个砝码:分别是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"); }
C程序设计的抽象思维-递归过程-砝码称重,布布扣,bubuko.com
原文地址:http://blog.csdn.net/jjjcainiao/article/details/26051459