巧换兔子——算法题解
我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛
正值辞旧迎新之际,在距离兔年农历新春不到俩个礼拜之际,想到了此次有关兔子为主题的算法题,并加以题解————
Description
正值兔年,安哥拉兔养殖场的员工去集市买采购40只兔子,员工有一张面值为100元的人民币,到了集市发现有售价各异的兔子,品种不同,价位不同,分别有10元一只,5元一只,2元一只和1元一只的,现在需要将40只兔子买齐,并且每种兔子至少一只。问:有几种买法?
Input
无输入
Output
一个数,表示共有多少种买法
Sample Input 1
无
Sample Output 1
不能告知,因为只有一个数,偷偷告诉你小于100
题解:
正确思路:
#include <stdio.h>
int main() {
int ten, five, two, one, page, num = 0;
for (ten = 1; ten <= 10; ten++) {
for (five = 1; five <= 20; five++) {
for (two = 1; two <= 40 ; two++) {//这里为40是因为最多就40只,多了也没有必要
for (one = 1; one <= 40 ; one++) {//这里为40是因为最多就40只,多了也没有必要
if(ten+five+two+one == 40 && 10*ten+5*five+2*two+one == 100){
num++;
}
}
}
}
}
printf("%d\n",num);
return 0;
}
在此思路中,首先找到判断条件:
- 四种售卖面值之和为100
- 四种的数量为40
- 四种都得有
因此有if(ten+five+two+one == 40 && 10ten+5five+2*two+one == 100)
对于for的循环条件:
每个初始值为1;边界就是每种售价的兔子所能最大换取数;++
在用++的方法有效避免了每次循环导致原有值无法初始化的误区。
错误思路:引以为戒
#include <stdio.h>
int main() {
int price, ten, five, two, one, page, num;
price = 100 - 10 - 5 - 2 - 1;//确保每种兔子至少一只,剩余82
for (ten = price/10; ten >= 0; ten--) {
price = 100 - 10 - 5 - 2 - 1;
price = price - ten*10;
page = 0;
page = page + ten;
for (five = price/5; five >= 0; five--) {
price = price - five*5;
page = page + five;
for (two = price/2; two >= 0 ; two--) {
price = price - two*2;
page = page + two;
for (one = price/1; one >=0 ; one--) {
page = page + one;
if(page == 40){
num++;
}
}
}
}
}
printf("%d\n",num);
return 0;
}
//输出结果永远为0
//原因是,由于采用了递减的思路,因此在建造过程中四重for循环忽略了每层循环重新开始时都会出现原有price,page,以及四种面值都会不能初始化,及每到下一次换一种加法,变量无法及时换成原有值,导致了想保存原有变量初值就又得设新变量导致进入死循环。
宣布答案:34

浙公网安备 33010602011771号