zoukankan      html  css  js  c++  java
  • 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
    ");
    	else
    		printf("FALSE
    ");
    }
    


  • 相关阅读:
    Step by step Dynamics CRM 2013安装
    SQL Server 2012 Managed Service Account
    Step by step SQL Server 2012的安装
    Step by step 活动目录中添加一个子域
    Step by step 如何创建一个新森林
    向活动目录中添加一个子域
    活动目录的信任关系
    RAID 概述
    DNS 正向查找与反向查找
    Microsoft Dynamics CRM 2013 and 2011 Update Rollups and Service Packs
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5411605.html
Copyright © 2011-2022 走看看