巧换兔子——算法题解

我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛

正值辞旧迎新之际,在距离兔年农历新春不到俩个礼拜之际,想到了此次有关兔子为主题的算法题,并加以题解————

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;
}


在此思路中,首先找到判断条件:

  1. 四种售卖面值之和为100
  2. 四种的数量为40
  3. 四种都得有

因此有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

posted @ 2023-01-09 21:56  Luciferpluto  阅读(2)  评论(0)    收藏  举报  来源