用一张一元票换 1 分、2 分和 5 分的硬币,每种至少一枚, 问有几种换法?
1.分析问题
整体放大100倍,不影响结果。
- 已知:总钱数:100,1元、2元、5元硬币;。
- 未知:1元数量:a;2元数量:b;五元数量:c 。
- 关系:a+2b+5c=100。
2.定义变量
根据分析的已知,未知按需要定义变量。
//二、数据定义
int money=100,a,b,c,count=0;
3.输入数据
无。
4.数据计算
4.1 确定问题的范围:根据问题的要求,确定需要尝试的数值范围。
钱:100。
5元硬币:最少1个,最多:(100-1-2)/5个。
2元硬币:最少1只,最多:总钱数-已换5元硬币数量 * 5 - 1个1元硬币,即(100-1-5*c)/2。
4.2 使用循环进行穷举:使用循环结构(如for循环)遍历范围内的每个数值。
这里我们要优先选择换钱数更大的硬币。
原因1:钱数更大,意味外层循环次更少。
原因2:将1元硬币留在最后,那么不管剩多少钱都是可以换整数个。
4.3 将数值带入问题中进行尝试:将当前数值带入问题中,判断是否满足问题的条件。
//四、数据计算
for(c=1;c<=(100-1-2)/5;c++){
for(b=1;b<=(100-1-5*c)/2;b++){
}
}
4.4 如果满足条件,输出结果或进行其他操作。如果当前数值满足问题的条件,可以输出该数值作为问题的解,或进行其他操作。
//四、数据计算
for(c=1;c<=(100-1-2)/5;c++){
for(b=1;b<=(100-1-5*c)/2;b++){
count++;
}
}
4.5 继续循环直到穷举完所有可能的解。
5.输出结果
#include<iostream>
using namespace std;
int main(){
//一、分析问题
//已知:总钱数:100,1元、2元、5元硬币;
//未知:1元数量:a;2元数量:b;五元数量:c
//二、数据定义
int money=100,a,b,c,count=0;
//三、数据输入
//四、数据计算
for(c=1;c<=(100-1-2)/5;c++){
for(b=1;b<=(100-1-5*c)/2;b++){
count++;
}
}
//五、输出结果
cout<<count;
return 0;
}