整数分解问题
任意给定一个大于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)
将整数按数组元素分解
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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的数。
注意:这个解决方案可能并不完全满足题目要求,因为它是找的最小个数的组合,而题目可能存在多个解。你可能需要根据实际需要对其进行调整。
解决 无用评论 打赏 举报
悬赏问题
- ¥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 疾病的获得与年龄是否有关