サブセットの合計-C++での動的計画法
この問題では、サイズ2 n の配列arr[]が与えられます。 。私たちのタスクは、動的計画法を使用してサブセット全体の合計を見つけるプログラムを作成し、それを解決することです。
関数F(x)=ΣA iを計算する必要があります すべてのxに対してx&i==iとなるようにします。つまり、iはxのビット単位のサブセットです。
問題を理解するために例を見てみましょう。
入力: A [] ={5、7、1、9}、n =2
出力: 5 12 6 22
説明: n =2の場合、xには4つの値があります。 0、1、2、3です。
ここで、関数の値を計算します:
F(0)=A 0 =5
F(1)=A 0 + A 1 =5 + 7 =12
F(2)=A 0 + A 2 =5 + 1 =6
F(3)=A 0 + A 1 + A 2 + A 3 =5 + 7 + 1 + 9 =22
動的計画法を使用したこの問題の解決策 マスクを見て、すべてのマスクのビット単位のサブセットを見つけます。動的計画法を使用してビット単位のサブセットを格納します。これにより、繰り返し回数が減ります。設定されたビットまたは設定されていないビットを持つインデックスには、2
n
がアクセスします。 複数回マスクします。
iインデックスのビットに基づいて繰り返します:
i番目のビットが設定されている場合:
DP(mask、i)=DP(mask、i-1)U DP(mask 2 i 、i-1)
i番目のビットが設定されていない場合:
DP(マスク、i)=DP(マスク、i-1)
ソリューションの動作を説明するプログラム
例
#include <iostream>
using namespace std;
const int N = 1000;
void SumOverSubsets(int a[], int n) {
int sum[1 << n] = {0};
int DP[N][N];
for (int i = 0; i < (1 << n); i++) {
for (int j = 0; j < n; j++) {
if (i & (1 << j)) {
if (j == 0)
DP[i][j] = a[i] + a[i ^ (1 << j)];
else
DP[i][j] = DP[i][j - 1] + DP[i ^ (1 << j)][j - 1];
} else {
if (j == 0)
DP[i][j] = a[i];
else
DP[i][j] = DP[i][j - 1];
}
}
sum[i] = DP[i][n - 1];
}
for (int i = 0; i < (1 << n); i++)
cout<<sum[i]<<"\t";
}
int main() {
int A[] = {5, 7, 1, 9};
int n = 2;
cout<<"The sum over subsets is \t";
SumOverSubsets(A, n);
return 0;
} 出力
The sum over subsets is 5 12 6 22
-
C ++でのアリコートの合計?
ここで、アリコートの合計は何ですか? nのアリコート和は、nを除くnのすべての完全な因子の合計です。たとえば、数値が20の場合、完全な因数は(1、2、4、5、10)です。したがって、アリコートの合計は22です。 興味深い事実の1つは、ある数のアリコートの合計がその数そのものである場合、その数は完全数であるということです。たとえば、6。係数は(1、2、3)です。アリコートの合計は1+2 + 3=6です。 次のアルゴリズムを使用してアリコートの合計を取得する方法を見てみましょう。 アルゴリズム getAliquotSum(n) begin sum := 0 &nbs
-
動的計画法を使用して最適な並列化を実行するC++プログラム
これは、動的計画法を使用して最適な並列化を実行するためのC++プログラムです。 アルゴリズム Begin Take the length n and dimension of matrix as input. MatrixChain() to find out minimum multiplications: Arguments: a[i][j]=Minimum number of scalar multiplications needed to