砝码称重问题——枚举法

枚举法解决砝码称重问题

【问题描述】设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其质量<=1000g),求出用他们能称出的质量的种类数(不包括质量为0的情况)。
【输入文件】输入1g,2g,3g,5g,10g,20g砝码的个数
【输出文件】输出能称出不同的重量的个数
【输入样例】1,1,0,0,0,0
【输出样例】3

一、分析

每种砝码可用的最大个数是确定的,且每种砝码的个数是连续的,能取0到最大的个数;
枚举变量:1g砝码,2g砝码,3g砝码,5g砝码,10g砝码,20g砝码。
枚举范围:1g砝码1~n1,2g砝码1-n2,3g砝码1-n3,5g砝码1-n4,10g砝码1-n5,20g砝码1-n6;

二、判重

定义一个布尔数组flag[1…1000],当得到重量v时,则把flag[v]置为true,下次得到v时,还是置true。最后只需要遍历flag数组,即可得到重量的个数。

三、算法思路

1、枚举不同砝码的个数,计算总重量,并将总重量对应的标志置为1。
2、根据标志,计算总重量的个数。

代码如下:

int main(){
	int n1, n2, n3, n5, n10, n20;
	bool flag[1005] = { 0 };
	cin >> n1 >> n2 >> n3 >> n5 >> n10 >> n20;	
	for (int i1=0; i1 <=n1; i1++)
	{
		for (int i2 = 0; i2 <= n2; i2++)
		{
			for (int i3 = 0; i3 <= n3; i3++)
			{
				for (int i5 = 0; i5 <= n5; i5++)
				{
					for (int i10 = 0; i10 <= n10; i10++)
					{
						for (int i20 = 0; i20 <= n20; i20++)
						{
							int sum = i1 + 2 * i2 + 3 * i3 + 5 * i5 + 10 * i10 + 20 * i20;
							flag[sum] = 1;
						}
					}
				}
			}
		}
	}
	int num = 0;
	for (int i = 1; i < 1000; i++)
	{
		if (flag[i])
			num++;
	}
	std::cout <<"Total="<< num << endl;
	return 0;
}

总结

用枚举法解决该问题是及其不合适的,该算法的时间复杂度是巨大的,性能效率也是非常低下的。已经不能用缩小枚举范围和减少枚举变量来优化算法,所以必须使用其他算法来优化性能。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值