给出一个数字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
答案 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 />