【问题】

在狄更斯时代,商人们用砝码和天平来称量商品的重量,假设你仅仅有几个砝码,就仅仅能精确地称出一定的重量。比如,假定仅仅有两个砝码:各自是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;elsereturn 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");elseprintf("FALSE\n");
}

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

  1. 第十二届蓝桥杯省赛 C/C++大学B组 试题G:砝码称重

    试题题目: 本题为编程题第二题 解题思路: 方法一:暴力求解 1.分析    首先利用数组W[N]W[N]W[N]记录NNN块砝码的质量.    模拟放取过程.先取第一块砝码放在天平上,再取第二块砝码 ...

  2. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-936 砝码称重

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-936 砝码称重 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-936 砝码称重 前言 关于数学的疑问 算法训练 砝码称重 ...

  3. 砝码称重【第十二届蓝桥杯】【省赛】【B组】

    砝码称重[第十二届蓝桥杯][省赛][B组] Description 你有一架天平和N个砝码,这N个砝码重量依次是W1.W2,-WN 请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边. ...

  4. 【蓝桥杯-砝码称重】

    蓝桥杯-砝码称重 问题描述: 你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1, W2, · · · WN 请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边 输入的第一行包含 ...

  5. 洛谷 P2347 砝码称重

    P2347 砝码称重 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入输出格式 输入格式: 输入方式:a1 a2 a3 a4 a5 a6 (表示1 ...

  6. 【DP】砝码称重 (ssl 1072)

    砝码称重 ssl 1072 题目大意: 有6种砝码,每种的个数分别为a1,a2,a3,a4,a5,a6,请问可以平出多少种重量(0除外) Description 设有1g.2g.3g.5g.10g.2 ...

  7. 【OJ8756】砝码称重V2,可达性多重背包

    砝码称重V2 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=100,000),要求:计 ...

  8. 【codevs2144】砝码称重2,哈希什么的都去死吧

    砝码称重 2 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 有n个砝码,现在要称一个质量为m的物体,请问最少需要挑出几个 ...

  9. Bailian4141 砝码称重【DP】

    4141:砝码称重 总时间限制: 1000ms 内存限制: 65536kB 描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000),要求:计算用这些砝码能称出的不同 ...

最新文章

  1. 51单片机好学嘛?学完51单片机学什么?
  2. webpack 采坑(CleanWebpackPlugin 插件报错: CleanWebpackPlugin is not a constructor ;)
  3. 第四章 SQL*plus介绍、常用命令
  4. Kubernetes 桌面客户端:Lens
  5. 手机当电脑麦克风 linux,WO Mic让手机成为电脑的无线麦克风
  6. java 模拟qq源码
  7. 制作windows启动盘-大于4GB镜像
  8. memcached和php关系,php – memcacheD这没关系?
  9. 程序员怎样获取更多的劳动收入
  10. 排序 -> 插入排序
  11. 乐高百变工程旋转飞椅知识点_每日一个知识点:关于磁盘的一些事儿
  12. Python内置函数sorted()从入门到精通
  13. 【Sublime】Mac下Sublime代码自动换行
  14. Luogu P1131 [ZJOI2007]时态同步 树形DP
  15. Linux内核中的信号量解析
  16. Tar的详细用法(转自Linux伊甸园)
  17. Stata进行logistic回归绘制列线图并做内部验证
  18. android_基础_修改系统背景(状态栏颜色、导航栏颜色、标题栏颜色等等)
  19. webscraper多页爬取_webscraper的常见爬取问题
  20. 微信提取公积金要先查征信?

热门文章

  1. 获取jar中的资源文件途径
  2. SpringMvc 3.x跨域+ajax请求
  3. android升级gradle到3.4.1
  4. Windows_Server_2008_R2_AD_DS架构-第06部分_FSMO、AD的诊断及排故
  5. [Android]ListView中分割线的设置
  6. C语言:在屏幕上打印杨辉三角形
  7. 使用easeui dialog弹出框中使用CKeditor多次加载后无法编辑问题
  8. 使用Jodd简化邮件服务的开发
  9. careercup-中等难度 17.9
  10. 2月第二周.COM增近12万 ×××域名.XXX减122个