代码优化 - 组合数量

时间:2016-12-27 22:07:17

标签: python optimization itertools

给出一个数字C(C是一个整数)并给出一个数字列表(我们称之为N,列表N中的所有数字都是整数)。 我的任务是找到代表C的可能性。

例如:

输入:

C = 4

N = [1, 2]

输出:

3

由于:

4 = 1 + 1 + 1 + 1 = 1 + 1 + 2 = 2 + 2

我的代码适用于小数字。但是我不知道如何优化它,因此它也适用于更大的整数。任何帮助将不胜感激!

有我的代码:

import numpy
import itertools
def amount(C):
    N = numpy.array(input().strip().split(" "),int)
    N = list(N)
    N = sorted(N)
    while C < max(N):
        N.remove(max(N))
    res = []
    for i in range(1, C):
        for j in list(itertools.combinations_with_replacement(N, i)):
            res.append(sum(list(j)))
    m = 0
    for z in range (0, len(res)):
        if res[z] == C:
            m += 1
    if N[0] == 1:
        return m + 1 
    else:
        return m 

2 个答案:

答案 0 :(得分:2)

您的算法的复杂性为public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> { private List<YourObject> yourObjectList; public YourAdapter() { ValueEventListener listener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot snap : dataSnapshot.child("pet").child("users").child(userID).getChildren()) { ... // add to list yourObjectList.add(snap.getValue(YourObject)); ... } } @Override public void onCancelled(DatabaseError databaseError) { } }; mReference.addListenerForSingleValueEvent(listener); ... } @Override public void onBindViewHolder(YourAdapter.ViewHolder holder, int position) { YourObject yourObject = yourObjectList.get(position); ... } @Override public int getItemCount() { return yourObjectList.size(); } } 。要更有效地解决此任务,请使用dynamic programming提示。

假设O(len(a)^С)使用术语dp[i][j]等于i的分区数。数组a[0], a[1], ..., a[j]不应包含重复项。此解决方案在a时间内运行。

O(C * len(a)^2)

答案 1 :(得分:0)

请先检查一下:https://en.wikipedia.org/wiki/Combinatorics
这也是https://en.wikipedia.org/wiki/Number_theory 如果我是你,我会首先在n [i]上划分c并检查c是不是正数 从您的示例:4/1 = [4] =&gt;整数计数1
4/2 = [2] =&gt;当且仅当1在集合
中时,整数计数器变为2,然后将[2]分区为1 + 1 如果你在集合中有3 [1,2,3],4/3只减去4-3 = 1,如果1在集合中,计数器增加,对于更大的结果我会根据集合进行一些分区BR />