n個數求和方案的問題

2021-08-21 14:42:23 字數 1009 閱讀 5380

給定乙個有n個正整數的陣列a和乙個整數sum,求選擇陣列a中部分數字和為sum的方案數。

當兩種選取方案有乙個數字的下標不一樣,我們就認為是不同的組成方案。

1、採用動態規劃

f[i][j]的意義為從i個書中選取某些數使其和為j的方案的個數,

則f[i][j]=(j>=array[i])?(f[i-1][j-array[i]]+f[i-1][j]):(f[i-1][j])。

初始條件對於所有的i,f[i][0]=1,相當於從i個數中都不選取,此時和為零。注意如果有溢位的話,二維陣列定義需要為long long int 型別的。

**如下:

#include

#include

using namespace std;

int main()

long long int **f = new long long int *[n + 1];

for (int j = 0; j < n + 1; j++)

else}}

cout << f[n][sum] << endl;

}2、採用遞迴方法。注意一下遞迴的終止條件,但是這種方案的花費時間較動態規劃要多一些。

#include

#include

using namespace std;

vectorq;

int plan = 0;

void dfs(int num, int *array, int length)

if (num < 0 || length <= 0)

q.push_back(array[length - 1]);

dfs(num - array[length - 1], array, length - 1);

q.pop_back();

dfs(num, array, length - 1);

}int main()

dfs(sum, array, n);

cout << plan << endl;

}

N個數求和

n個數求和 本題的要求很簡單,就是求n個數字的和。麻煩的是,這些數字是以有理數分子 分母的形式給出的,你輸出的和也必須是有理數的形式。輸入格式 輸入第一行給出乙個正整數n le 100 隨後一行按格式a1 b1 a2 b2 給出n個有理數。題目保證所有分子和分母都在長整型範圍內。另外,負數的符號一定...

N個數求和

本題的要求很簡單,就是求n個數字的和。麻煩的是,這些數字是以有理數分子 分母的形式給出的,你輸出的和也必須是有理數的形式。輸入第一行給出乙個正整數n 100 隨後一行按格式a1 b1 a2 b2 給出n個有理數。題目保證所有分子和分母都在長整型範圍內。另外,負數的符號一定出現在分子前面。輸出上述數字...

N個數求和(20 分)

7 1 n個數求和 20 分 本題的要求很簡單,就是求n個數字的和。麻煩的是,這些數字是以有理數分子 分母的形式給出的,你輸出的和也必須是有理數的形式。輸入第一行給出乙個正整數n 100 隨後一行按格式a1 b1 a2 b2 給出n個有理數。題目保證所有分子和分母都在長整型範圍內。另外,負數的符號一...