ジム:
整数の配列を考えると、私は合計で最長のサブセット(Powersetの)を見つけようとしているリース可能な時間複雑さを使用してkに等しいです。inputArr = [1、2、8、1、1、7]及びk = 10、出力は4でなければならない場合、例えば和と最長のサブセットが10に等しいので、[1、1、1、7]。
編集:私は、重要な詳細を忘れてしまったかもしれません。配列の要素はすべて正と非ゼロです。
私はgeeksforgeeks上で見つけたこのアルゴリズムを使用:https://www.geeksforgeeks.org/finding-all-subsets-of-a-given-set-in-java/
コードは罰金を動作しますが、私が持っている唯一の問題は、実行時間です。私はオンラインこれを提出し、私がタイムアウトにそれを実行終了を提出するときになっています。
int maxSubLength=0;
for (int i = 1; i < (1<<n); i++) //n is the length of inputArr
{
int sum=0, length=0;
for (int j = 0; j < n; j++)
if ((i & (1 << j)) > 0)
{
sum+=inputArr[j];
length++;
if (sum>k)
break;
}
if (sum==k)
maxSubLength=Math.max(maxSubLength, length);
}
任意のより高速なアルゴリズムはありますか?私は、再帰的なものを試してみました、それは助けにはなりませんでした。
ギラッドBarkan:
我々は、動的プログラミングでこれを解決することができO(n*k)
、時間とO(k)
スペース。JavaScriptコード:
function f(A, K){
let m = new Array(K + 1).fill(0)
for (let a of A){
for (let k=K; k>=a; k--)
if (m[k - a])
m[k] = Math.max(m[k], 1 + m[k - a])
m[a] = Math.max(m[a], 1)
}
return m[K]
}
var A = [1, 2, 8, 1, 1, 7]
var K = 10
console.log(f(A, K))