10 精币
需求:
2137,1608,608,537,502,481,469,441,427,421,417,411,410,391,377,346,338,336,333,330,319,316,310,308,302,302,299,297,283,277,276,273,265,264,262,250,246,228,220,210,202,195,194,192,181,181,167,165,154,139,118
有这么一组无需的数组,从中找出部分数组,使他们相加之和等于或大于但最接近一个指定的目标值(比如10000),要求:
1,优先保证相加的总和等于目标值,如果不行,只能大于他,但是越接近越好,差值越小越好
2,尽可能优先使用较大的数,如果用较大的数总和超过了,可以把后面较大的数用较小的数替换,目的是要越接近目标数
3,每个数字只能用一次
4,尽量用较少的组合,如果出现较多的组合越接近目标值,那么就用较多组合那个
用易语言 编写子程序,参数1为要查找的整数型数组,参数2为指定整数型目标值,参数3为整数型参考数组,返回找到的目标组合数组
用了几个ai,kimi,ds,豆包,元宝,都写不出来,千问倒是能写出来个js的,让他翻译成易语言也是各种问题,吧js方法让其他几个ai翻译成易语言也是不行。
下面是js代码,有没有大佬帮忙翻译下。
[JavaScript] 纯文本查看 复制代码
// 查找最接近目标值的组合
function findTargetCombination(array, targetValue, referenceArray) {
// 按降序排序,优先使用大数
let sortedArray = [...array].sort((a, b) => b - a);
let bestSum = 0;
let bestCombination = [];
// 使用动态规划思想,记录所有可能的和
let dp = new Map(); // 存储 {和: [组合]}
dp.set(0, []); // 初始状态:和为0,组合为空
for (let num of sortedArray) {
let newDp = new Map(dp); // 复制当前状态
for (let [sum, combination] of dp.entries()) {
let newSum = sum + num;
if (newSum <= targetValue) { // 只保留不超过目标值的组合
let newCombination = [...combination, num];
if (!newDp.has(newSum) || newCombination.length < newDp.get(newSum).length) {
newDp.set(newSum, newCombination);
if (newSum > bestSum) {
bestSum = newSum;
bestCombination = newCombination;
}
}
}
}
dp = newDp;
}
// 如果没找到小于等于目标的组合,使用贪心算法找最接近的大于目标的组合
if (bestSum === 0) {
let tempSum = 0;
let tempCombination = [];
for (let num of sortedArray) {
tempCombination.push(num);
tempSum += num;
if (tempSum >= targetValue) {
break;
}
}
return tempCombination;
}
return bestCombination;
}
最佳答案
查看完整内容
补充内容 (2026-1-15 10:57):
开始运行被调试程序
* “找到组合:2137,1608,608,537,502,481,469,441,427,421,417,411,410,391,346,276,118,
总和:10000”
被调试易程序运行完毕
补充内容 (2026-1-15 12:41):
AI is with me.
评分
查看全部评分
回答提醒: 如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至
源码区 可获得加分喔。
友情提醒: 本版被采纳的主题可在
申请荣誉值 页面申请荣誉值,获得
1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道: 申请荣誉值 →