C++动态规划求解砝码称重问题(双向的,包括减法情况)

1、定义

	先来读一读题目,题目如下:

**现有一组砝码,重量互不相等,分别为m1、m2……mn;他们可取的最大数量分别为x1、x2……xn。现在要用这些砝码去称物体的重量,问能称出多少种不同的重量。
看完这个题目感觉似乎无从下手,难道要一个个的枚举拼凑吗?答案是否定的。不绕弯子了,下面直接进入动态规划的主场。
设想第0种情况,假如现在只有0个砝码,问它能称出的重量有几种?是个人都知道只能称0的重量,并且只有这么1种情况。
设想第1种情况,现在只有1种规格的砝码,它的重量是1,数量是1个,问它能称出的重量有几种?很明显,能称出0和1这2种重量,一共2种情况。
设想第2种情况,现在有2种规格的砝码,它们的重量分别是1和2,1克的砝码1个,2克的砝码1个,问它能称出的重量有几种?用手比划比划应该能知道,能称出1,2,3这4种重量,3种情况。
。。。
。。。
设想第n种情况,现在有n种规格的砝码,他们的重量分别为m1,m2。。。mn,问它能称出的重量是几种?这个时候貌似不是用手比划比划就可以出来结果了。但是这个问题的提出,就相当于是题目最终要解决的问题了。如果能够利用某种规律回答这第n种情况的提问,那么砝码称重的问题就可以完全解决。问题来了,上面的分析过程是否存在一个规律呢?答案是规律肯定存在,并且分析这种规律的思路就是动态规划的思路。**

2、思路

第0种情况,f(0)=1;

第1种情况,f(1)=2;如果把这个结果和第0种情况结合起来看,可以认为:f(1)=f(0)+1,此式意义非凡,它的意义为:第1种情况可以建立在第0种情况的基础上去解决,单单来看情况1的砝码可以称1种重量(即用一个1克的砝码称1克的物体)不同于情况0中,二者相加即为f(1)的结果。

第2种情况,f(2)=4=f(1)+2,为什么加2?因为如果仅仅只有1个1克的砝码和1个2克的砝码,它只能称出重量为2克,3克这两种不同于情况1中的重量(情况1中已经解决了0克和1克的问题)。

现在假定已经解决了第n-1种情况,即f(n-1)的值已经知道,那么我们如果能计算出单单第n种情况能称出哪些不同于n-1种情况中的重量,假定为x种,那么f(n)=f(n-1)+x。最终问题便得到了解决。

这里不仅包括求加法的情况,还包括了求减法的情况。

3、代码详解

#include<iostream>
#include<cmath>

using namespace std;

//求和定义辅助空间
int SumArray(int* arr, int len) {
   

	int sum = 0;
	for (int i = 0
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值