枚举法解决砝码称重问题
【问题描述】设有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;
}
总结
用枚举法解决该问题是及其不合适的,该算法的时间复杂度是巨大的,性能效率也是非常低下的。已经不能用缩小枚举范围和减少枚举变量来优化算法,所以必须使用其他算法来优化性能。