【问题标题】:Minimize or find a n ideal subset-sums from a list of numbers which are less than or equal to some N从小于或等于某个 N 的数字列表中最小化或找到 n 个理想子集和
【发布时间】:2019-12-13 04:18:27
【问题描述】:

给定一个数字列表,lst = [1, 1, 2, 4, 3, 2, 1, 1, 1, 2, 1, 4, 3, 1] 我如何找到小于或等于 4 的理想列表数量?

这里有很多可能性。目标是最小化可能列表的数量。该程序需要创建子集列表,如下所示:{4}, {4}, {3, 1}, ... , {1, 1}

请注意最后一个列表子集如何不等于四,但它更少。这个问题很难,原因如下:

  • 程序必须能够找到小于或等于总和的subset-sums
  • 程序需要开始,首先查看最大
  • ,将原始列表中的值删除到子列表中

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 现在我刚刚想到了。我的教育是工程学,所以我希望在这里遇到一位对图论或其他知识了解更多的 CS。
  • 子集最多包含两个元素? {1,1,1} 是可能的结果之一吗?
  • {1, 1, 1} 是一个可能的结果,是的。我不知道一个子集最多包含两个元素。
  • @GeneralCode 并不是要挖苦你。因此,我的算法在解决方案中没有 {1,1}。如果您必须验证算法,您能否发布一些示例输入和输出?

标签: python c++ dynamic tree subset-sum


【解决方案1】:

这是我的尝试。 总体思路是对列表进行排序,从左到右,每次迭代贪婪地挑选最大的子集。时间复杂度为O(n)

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<int> lst{1, 1, 2, 4, 3, 2, 1, 1, 1, 2, 1, 4, 3, 1};
    std::sort(lst.begin(),lst.end()); //sort the list
    int target = 4;

    int left = 0;
    int right = lst.size()-1;

    std::vector<std::vector<int>> solutions;
    while (left<right ){
        if(lst[left] > target)   // break if no solutions
            break;

        if(lst[right] > target) // ignore larger right values
            right--;


        if(lst[right]<=target){   // while the total sum is less than target, keep adding the elements
            std::vector<int> subset;
            subset.push_back(lst[right]);
            int sum = lst[right];
            while(left<right && lst[left]+sum<=target){
                sum+=lst[left];
                subset.push_back({lst[left]});
                left++;
            }
            solutions.push_back(subset);
            right--;
        }

    }

    for(auto& ss : solutions){
        std::cout<<'{';
        for(auto n:ss){
            std::cout<<n<<',';
        }
        std::cout<<"\b}";
        std::cout<<std::endl;
    }

}

【讨论】:

  • 我对你提出这个问题的速度印象深刻,谢谢你的帮助。
猜你喜欢
  • 2021-01-08
  • 2021-06-09
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 2015-10-24
  • 2019-09-26
相关资源
最近更新 更多