Performance 子集和变量

Performance 子集和变量,performance,algorithm,Performance,Algorithm,我通读了所有的子集和主题,但在实现以下问题的算法时仍然存在问题 给定一个由N个整数组成的数组(N),我没有现成的答案,但我建议大家看看“装箱问题”,这里可能有用 主要的问题是找到所有可能给出数字K的和。因此,尝试以下方法: Collection All_Possible_Sums_GivingK; find_All_Sums_Equal_To_K(Integer K, Array A) { /* this function after finding result add it

我通读了所有的子集和主题,但在实现以下问题的算法时仍然存在问题


给定一个由N个整数组成的数组(N),我没有现成的答案,但我建议大家看看“装箱问题”,这里可能有用

主要的问题是找到所有可能给出数字K的和。因此,尝试以下方法:

Collection All_Possible_Sums_GivingK;

find_All_Sums_Equal_To_K(Integer K, Array A)
{
    /* this function after finding result
    add it to global Collection AllPossibleSumsGivingK; */
    find_All_Elements_Equal_To_K(Integer K, Array A); 

    Array B = Remove_Elements_Geater_Or_Equal_To_K(Integer K, Array A);

    for all a in A {
        find_All_Sums_Equal_To_K(Integer K-a, Array B-a) 
    }
} 

我没有现成的答案,但我建议大家看看“垃圾箱包装问题”,这里可能有用

主要的问题是找到所有可能给出数字K的和。因此,尝试以下方法:

Collection All_Possible_Sums_GivingK;

find_All_Sums_Equal_To_K(Integer K, Array A)
{
    /* this function after finding result
    add it to global Collection AllPossibleSumsGivingK; */
    find_All_Elements_Equal_To_K(Integer K, Array A); 

    Array B = Remove_Elements_Geater_Or_Equal_To_K(Integer K, Array A);

    for all a in A {
        find_All_Sums_Equal_To_K(Integer K-a, Array B-a) 
    }
} 

我修改了之前对不同子集和变量的回答:

我用上面的数字在K=8的情况下运行它,我们在两个不同的地方为两个“覆盖”中的一个重复使用1。让我知道它是如何为您工作的

公共类涡轮加法器2{
//问题输入
//独特的价值观
私有静态final int[]data=newint[]{1,2,3,4,5};
//计数[i]=i的副本数
私有静态final int[]计数=新int[]{2,1,1,1,1};
//我们想要达到的数额
私有静态int目标=8;
私有静态类节点{
公共最终综合指数;
公共最终整数计数;
公共最终节点前置列表;
公共最终综合预算;
公共节点(int索引、int计数、节点prevInList、int prevSum){
这个指数=指数;
this.count=计数;
this.prevInList=prevInList;
this.prevSum=prevSum;
}
}
私有静态节点和[]=新节点[目标+1];
//仅用于printString和isSolvable。
私有静态int禁止值[]=新int[data.length];
私有静态布尔可解(节点n){
如果(n==null){
返回true;
}否则{
while(n!=null){
int idx=n.索引;
//我们防止对已经看到的值进行递归。
//不要使用任何小于lastIdx的索引

如果(禁止值[idx]+n.countI修改了我之前给不同子集和变量的答案:

我用上面的数字在K=8的情况下运行它,我们在两个不同的地方为两个“覆盖”中的一个重复使用1。让我知道它是如何为您工作的

公共类涡轮加法器2{
//问题输入
//独特的价值观
私有静态final int[]data=newint[]{1,2,3,4,5};
//计数[i]=i的副本数
私有静态final int[]计数=新int[]{2,1,1,1,1};
//我们想要达到的数额
私有静态int目标=8;
私有静态类节点{
公共最终综合指数;
公共最终整数计数;
公共最终节点前置列表;
公共最终综合预算;
公共节点(int索引、int计数、节点prevInList、int prevSum){
这个指数=指数;
this.count=计数;
this.prevInList=prevInList;
this.prevSum=prevSum;
}
}
私有静态节点和[]=新节点[目标+1];
//仅用于printString和isSolvable。
私有静态int禁止值[]=新int[data.length];
私有静态布尔可解(节点n){
如果(n==null){
返回true;
}否则{
while(n!=null){
int idx=n.索引;
//我们防止对已经看到的值进行递归。
//不要使用任何小于lastIdx的索引

如果(禁止值[idx]+n.count这听起来不像子集和问题的变体,这听起来完全像子集和问题。你的整个帖子可以总结为“我需要集合S的所有子集,其元素和为K”这听起来不像是子集和问题的变体,这听起来完全像子集和问题。你的整个帖子可以总结为“我需要集合S的所有子集,其元素和为K”谢谢Martin。我将您的Java代码翻译为C#。这非常快,但是我的C#版本不适用于某些可能的输入。请您使用以下输入测试算法。data=new int[]{1,2,3},counts=new int[]{1,1,2},target=3。data=new int[]{1,2,3},counts=new int[]{1,1,2},target=any_number_大于_6。我将进一步分析您的解决方案,如果我对其进行了改进,我会告诉您。再次感谢!@Marko:是的,我看到了问题。问题是我们需要跟踪到目前为止看到的所有求和集,而不是使用的快捷方式。我们可以在isSolvable中进行调整以放松这一行()来自“if(biddenvalues[idx]+n.count谢谢Martin。我把你的Java代码翻译成了C#。这非常快,但是有一些可能的输入,我的C#版本不起作用。请,你能用以下输入测试算法吗。data=new int[]{1,2,3},counts=new int[]{1,1,2},target 3。data=new int[]{1,2,3},counts=newint[]{1,1,2},target=any_number_大于_6。我将进一步分析您的解决方案,如果我对其进行了改进,我会告诉您。再次感谢!@Marko:是的,我看到了问题。问题是我们需要跟踪到目前为止看到的所有求和集,而不是使用的快捷方式。我们可以在isSolvable中进行调整以放松这一行()来自“如果(禁止值[idx]+n.count