错时三刻 2023-11-12 10:00 采纳率: 70%
浏览 8

将整数按数组元素分解

整数分解问题
任意给定一个大于1000的正整数,将其分解成下列若干个整数(可重复)的和:57,71,87,97,99,101,103,113,114, 115, 128,129,131,137,147,156, 163, 186.
请编写一个函数,输入参数为一个大于1000且小于60000的正整数,输出参数为分解方案。
(例如:输入参数为1530,输出参数为1530=87+993+128+1372+186*4)

  • 写回答

2条回答 默认 最新

  • 木头人123。 2023-11-12 10:18
    关注

    对于这个问题,一种可能的解决方案是使用动态规划。以下是一个简化版的C代码实现,由于C语言不支持动态数组,所以这里仅给出了核心算法部分:

    #include <stdio.h>
    
    #define MAX 60000
    #define NUM 18
    
    int comp[MAX+1] = {0}; // 组成的数的个数
    int path[MAX+1] = {0}; // 最后加的数
    int numList[NUM] = {57,71,87,97,99,101,103,113,114,115,128,129,131,137,147,156,163,186}; // 可用的数
    
    void solve(int target) {
        int i, j;
        for (i = 1; i <= target; i++) {
            for (j = 0; j < NUM; j++) {
                if (numList[j] <= i && comp[i - numList[j]] + 1 > comp[i]) {
                    comp[i] = comp[i - numList[j]] + 1;
                    path[i] = i - numList[j];
                }
            }
        }
    
        // 打印结果
        printf("%d=", target);
        while (path[target] != 0) {
            printf("%d+", target - path[target]);
            target = path[target];
        }
        printf("%d\n", target);
    }
    
    int main() {
        int target = 1530;
        solve(target);
        return 0;
    }
    

    这段代码首先初始化了一个长度为target+1的数组comp,用于存储组成每个数的最小个数,以及一个路径数组path,用于回溯每个数是由哪两个数相加得来的。然后,通过双重循环,寻找可以组成每个数的最小个数,以及路径。最后,通过回溯路径数组,打印出组成target的数。

    注意:这个解决方案可能并不完全满足题目要求,因为它是找的最小个数的组合,而题目可能存在多个解。你可能需要根据实际需要对其进行调整。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月12日

悬赏问题

  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?
  • ¥20 用户端如何上传图片到服务器和数据库里
  • ¥15 现在研究生在烦开题,看了一些文献,但不知道自己要做什么,求指导。
  • ¥30 vivado封装时总是显示缺少一个dcp文件
  • ¥100 pxe uefi启动 tinycore
  • ¥15 我pycharm运行jupyter时出现Jupyter server process exited with code 1,然后打开cmd显示如下
  • ¥15 可否使用carsim-simulink进行四轮独立转向汽车的联合仿真,实现四轮独立转向汽车原地旋转、斜向形式、横移等动作,如果可以的话在carsim中如何进行相应设置
  • ¥15 Caché 2016 在Java环境通过jdbc 执行sql报Parameter list mismatch错误,但是同样的sql使用连接工具可以查询出数据
  • ¥15 疾病的获得与年龄是否有关