python中的不可分子集

python中的不可分子集,python,Python,我得到了一个由n个整数组成的集合S,并且必须打印S的最大子集S'的大小,其中S'中任意2个数字的和不能被k整除 输入格式 第一行分别包含两个空格分隔的整数n和k。 第二行包含n个空格分隔的整数,用于描述集合的唯一值 我的代码: import sys n,k = raw_input().strip().split(' ') n,k = [int(n),int(k)] a = map(int,raw_input().strip().split(' ')) count = 0 for i in

我得到了一个由n个整数组成的集合S,并且必须打印S的最大子集S'的大小,其中S'中任意2个数字的和不能被k整除

输入格式

第一行分别包含两个空格分隔的整数n和k。 第二行包含n个空格分隔的整数,用于描述集合的唯一值

我的代码:

import sys


n,k = raw_input().strip().split(' ')
n,k = [int(n),int(k)]
a = map(int,raw_input().strip().split(' '))
count = 0


for i in range(len(a)):
    for j in range(len(a)):
        if (a[i]+a[j])%k != 0:
            count = count+1

print count
4 3
1 7 2 4
3
10
输入:

import sys


n,k = raw_input().strip().split(' ')
n,k = [int(n),int(k)]
a = map(int,raw_input().strip().split(' '))
count = 0


for i in range(len(a)):
    for j in range(len(a)):
        if (a[i]+a[j])%k != 0:
            count = count+1

print count
4 3
1 7 2 4
3
10
预期输出:

import sys


n,k = raw_input().strip().split(' ')
n,k = [int(n),int(k)]
a = map(int,raw_input().strip().split(' '))
count = 0


for i in range(len(a)):
    for j in range(len(a)):
        if (a[i]+a[j])%k != 0:
            count = count+1

print count
4 3
1 7 2 4
3
10
我的输出:

import sys


n,k = raw_input().strip().split(' ')
n,k = [int(n),int(k)]
a = map(int,raw_input().strip().split(' '))
count = 0


for i in range(len(a)):
    for j in range(len(a)):
        if (a[i]+a[j])%k != 0:
            count = count+1

print count
4 3
1 7 2 4
3
10

我做错了什么?任何人?

您可以使用以下方法在
O(n)
时间内解决此问题:

# given k, n and a as per your input.
# Will return 0 directly if n == 1
def maxsize(k, n, a):
    import itertools
    while n > 1:
        sets = itertools.combinations(a, n)
        for set_ in sets:
            if all((u+v) % k for (u, v) in itertools.combinations(set_, 2)):
                return n
        n -= 1
    return 0
L = [0]*k

for x in a: 
    L[x % k] += 1
res = 0
for i in range(k//2+1):
    if i == 0 or k == i*2:
        res += bool(L[i])
    else:
        res += max(L[i], L[k-i])

print(res)
是的,解决这个问题是非常可能的。正如planetp正确指出的,它与我用java编写的解决方案几乎相同。添加注释以更好地理解

导入java.io。;导入java.util

公共类解决方案{

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n=in.nextInt();
    int k=in.nextInt();
    int [] arr = new int[k];
    Arrays.fill(arr, 0);
    Map<Integer,Integer> mp=new HashMap<>();
Java解决方案

public class Solution {

    static PrintStream out = System.out;

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner in = new Scanner (System.in);
        int n = in.nextInt();
        int k = in.nextInt();        
        int[] A = new int[n];

        for(int i=0;i<n;i++){
            A[i]=in.nextInt();
        }

        int[] R = new int[k];
        for(int i=0;i<n;i++)            
            R[A[i] % k]+=1;

        int res=0;
        for(int i=0;i<k/2+1;i++){
            if(i==0 || k==i*2)
                res+= (R[i]!=0)?1:0;
            else
                res+= Math.max(R[i], R[k-i]);            
        }

        out.println(res);
    }
}
公共类解决方案{
静态打印流输出=System.out;
公共静态void main(字符串[]args){
/*在此处输入代码。从STDIN读取输入。将输出打印到STDOUT。您的类应命名为Solution*/
扫描仪输入=新扫描仪(系统输入);
int n=in.nextInt();
int k=in.nextInt();
int[]A=新的int[n];

对于(int i=0;i)您的代码做了一些与问题完全无关的事情。这不是您做错了什么小细节的问题。@C14L:如果不选择两个加起来是k的倍数的元素,您可以选择s的多少个元素?@user2357112那么
len([x代表itertools.compositions(a,2)if operator.add(*x)%k])
?@C14L:您仍然在解决错误的问题。@user2357112我得到了正确的解决方案。剩余的项中没有一项
[(1,7),(1,4),(7,4)]
可以组合成可被
k
整除的指数时间,但至少它通常给出了正确的答案。
返回0
是一个错误的值。它只适用于n=0。当输入至少有一个元素时,我们总是可以选择一个有效的1元素子集。是的。指数时间。你希望我中断吗NP套装?付给我1000000美元(CMI奖)我会试试XDDDDY,你不需要解P/NP就可以在线性时间内做到这一点。有一个相当简单的解决方案,它基于决定是否允许在你的集合中为每个可能的
x
使用剩余
0
k/2
的特殊情况。将其作为答案发布,并进行我的投票)。我今天太笨了。这是一个非常棒的答案,更深入地解释了这个算法:兄弟。这行是什么意思?
res+=bool(L[I])
Increment
res
如果
L[I]
是“真”(非零)@planetp,它类似于
!L[I].nil?
inruby@Eswar
/
表示楼层分割,即先分割,然后向下取整。3/2=1.5,3//2=1如果要存储值,我将使用哈希集,而不是映射