头歌资源库(28)值为1的表达式

61 阅读2分钟

一、 问题描述

二、算法思想     

  1. 将给定的分数按照从大到小的顺序排序。

  2. 定义一个变量current_sum来表示当前已经相加的分数的和。

  3. 定义一个列表current_solution来保存当前的组合。

  4. 定义一个列表solutions来保存所有满足条件的组合。

  5. 调用回溯函数backtrack,传入参数:当前的索引index,当前的和current_sum,当前的组合current_solution。

  6. 在回溯函数中,判断当前的和是否等于1,如果等于1,则将当前的组合添加到solutions中,并返回。

  7. 对于当前的索引index,遍历从index开始的剩下的分数,对每个分数进行尝试相加:

    • 如果相加后的和小于1,则将当前的分数添加到current_solution中,current_sum更新为当前和加上当前分数。
    • 递归调用backtrack函数,传入参数index+1,current_sum,current_solution。
    • 在递归调用返回后,将当前的分数从current_solution中移除,current_sum更新为当前和减去当前分数。
  8. 回溯函数返回后,将solutions输出为表达式形式的组合。

三、代码实现    

#include <stdio.h>

int denominators[] = {2, 3, 4, 5, 6, 8, 10, 12, 15};
int numerators[] = {60, 40, 30, 24, 20, 15, 12, 10, 8};
int used[9] = {0}; 
int count = sizeof(denominators) / sizeof(denominators[0]); 

void find_combinations(int idx, int current_sum) {
    if (current_sum == 120) {
        int first = 1; 
        for (int i = 0; i < count; i++) {
            if (used[i]) {
                if (!first) printf("+"); 
                printf("1/%d", denominators[i]);
                first = 0; 
            }
        }
        printf("\n");
        return;
    }
    if (current_sum > 120 || idx >= count) return;
    find_combinations(idx + 1, current_sum);
    used[idx] = 1;
    find_combinations(idx + 1, current_sum + numerators[idx]);
    used[idx] = 0; 
}

int main() {
    find_combinations(0, 0); 
    printf("end\n");
    return 0;
}

  执行结果  

结语    

只有付出真诚的努力和奋斗

才能获得真正的成就和收获

!!!