c - 最大化产生给定总和的不同数字的计数 'k'

标签 c algorithm dynamic-programming

我需要帮助解决这个动态规划问题。

Given a positive integer k, find the maximum number of distinct positive integers that sum to k. For example, 6 = 1 + 2 + 3 so the answer would be 3, as opposed to 5 + 1 or 4 + 2 which would be 2.

我首先想到的是,我必须找到一个子问题。因此,要找到 k 的最大和,我们需要找到小于 k 的值的最大和。所以我们必须遍历值 1 -> k 并找到这些值的最大总和。

令我困惑的是如何制作公式。我们可以将 M(j) 定义为总和为 j 的不同值的最大数量,但实际上我该如何为其编写公式?

到目前为止,我的逻辑是否正确,有人可以解释如何逐步解决这个问题吗?

最佳答案

不需要动态规划。让我们从一个例子开始:

50 = 50
50 = 1 + 49
50 = 1 + 2 + 47  (three numbers)
50 = 1 + 2 + 3 + 44  (four numbers)
50 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 14  (nine numbers)

九个数字是我们所能达到的极限。如果我们使用十个数字,总和将至少为 1 + 2 + 3 + ... + 10 = 55,即大于 50 - 因此这是不可能的。

事实上,如果我们恰好使用 n 个不同的正整数,那么具有这样总和的最小数字是 1+2+...+n = n(n+1)/2。通过求解二次方程,我们得到 M(k) 大约为 sqrt(2k)。

因此算法是取数 k,减去 1、2、3 等,直到我们不能再减 1。C 中的算法:

int M(int k) {
    int i;
    for (i = 1; ; i++) {
        if (k < i) return i - 1;
        else k -= i;
    }
}

关于c - 最大化产生给定总和的不同数字的计数 'k',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37106869/

相关文章:

algorithm - 比较 splay 树效率的最佳方法是什么?

algorithm - 什么是遍历 Trie 以检查拼写建议的好算法?

python - 求矩阵内 1s 的最大平方时出错

c++ - 如何返回3个值之间的最大值?

c - 对于函数指针 "fptr",为什么 "fptr"和*fptr的值相同?*fptr到底是什么意思?我只知道(*fptr)()或fptr()

cmocka,如何检查函数指针

c - 仅在给定指针的情况下交换字符

算法 : Find recursive equation of divide and conquer algorithm

algorithm - 寻找整数中的最小数

objective-c - 多少()宏 objective-c