【问题标题】:Find maximal weighted subset such that any two elements in subset do not sum to k找到最大加权子集,使得子集中的任何两个元素总和不等于 k
【发布时间】:2020-08-26 20:08:36
【问题描述】:

子集的权重是每个键的值的长度。

这是我的尝试:

def nonDivisibleSubset(k, s):
    remdict={}
    result=[]
    for i in range(len(s)):
        rem=s[i]%k
        if rem not in remdict:
            remdict[rem]=[s[i]]
        else:
            remdict[rem].append(s[i])
    b=dict(sorted(remdict.items(), key= lambda x: len(x[1]), reverse=True))


Input: 
k=7
{2: [576, 338, 149, 702, 282, 436], 6: [496, 727, 209], 5: [278, 124], 4: [410, 718], 1: [771, 575]}

在这本字典中,我只想附加键 2,6,4 的值,因为 2+6!=7 和 2+4!=7 和 6+4!=7**

【问题讨论】:

  • 为什么是 2,4,6 而不是 4,5,6? 4+5、4+6 和 5+6 也不等于 7。
  • 对不起,我忘了补充。值的长度应该是最大值。
  • 首先想到的是极大团,如果(u,v)是优势u+v!=k,但极大团是NP Hard,希望有更好的解决方案...
  • 4,5,6 为 3 个值,与 2,4,6 相同。那么什么是“最大”?
  • 键 4,5,6 的值长度为 7,而 2,4,6 为 11。因此应选择 2,4,6,因为它具有最大值长度

标签: python algorithm subset


【解决方案1】:

所以首先 - 我们需要找到所有不同的组合,然后从中找到最大值。

这是查找所有不同组合的代码:

def check(d, s, k):
        for i in d:
            if i + s == k:
                return False
        return True

for i in s:
    temp = [i]
    d = s.copy()
    d.pop(i)
    for j in d:
        if check(temp, j, k):
            temp.append(j)
     temp.sort()
        res_lst.append(temp)
    unique_data = [list(x) for x in set(tuple(x) for x in res_lst)]

(参考如何找到unique_data:Python: Uniqueness for list of lists)

找到最大子集:

res = []
res_sum = 0
for l in unique_data:
    tmp_sum = 0
    for n in l:
        tmp_sum += len(s[n])
    if tmp_sum > res_sum:
        res = l
        res_sum = tmp_sum
return res

【讨论】:

    【解决方案2】:

    这个想法是根据它们除以 k 时给出的余数对 s 中的数字进行分组,并将余数存储为键,并将它们的频率/计数存储为值。然后在 max(key,k-key) 之间进行选择,并确保在 key==0 或 key+key=k 时只选择一个。可能还有其他方法可以在不使用字典的情况下解决这个问题。

    def nonDivisibleSubset(k, s):
            remdict={}
            result=[]
            keyss=[]
            for i in range(len(s)):
                rem=s[i]%k
                if rem not in remdict:
                    remdict[rem]=1
                else:
                    remdict[rem]+=1
            #b=dict(sorted(remdict.items(), key= lambda x: len(x[1]), reverse=True))
            print(remdict)
            for key,value in remdict.items():
                if key==0:
                    result.append(1)
                elif key+key==k:
                    result.append(1)
                elif (k-key) in remdict.keys() and k-key not in keyss :
                    print(max(remdict[key],remdict[k-key]))
                    keyss.append(key)
                    result.append(max(remdict[key],remdict[k-key]))
                elif (k-key) not in remdict.keys():
                    print(remdict[key])
                    result.append(remdict[key])
            print(result)
            return (sum(result))
    

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多