數字和爲sum的方法數 滴滴出行2017校招 (線性dp)

時間限制:1秒 空間限制:32768K 熱度指數:9735
 算法知識視頻講解

題目描述

給定一個有n個正整數的數組A和一個整數sum,求選擇數組A中部分數字和爲sum的方案數。
當兩種選取方案有一個數字的下標不一樣,我們就認爲是不同的組成方案。

輸入描述:

輸入爲兩行:
 第一行爲兩個正整數n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)
 第二行爲n個正整數A[i](32位整數),以空格隔開。

輸出描述:

輸出所求的方案數
示例1

輸入

5 15 5 5 10 2 3

輸出

4
#include <bits/stdc++.h>
using namespace std;
int a[1111];
long long dp[1111][1111];
int main(){
	int n, sum;
	cin >> n >> sum;
	for(int i = 1; i <= n; ++i){
		scanf("%d", &a[i]);
	}
	dp[0][0] = 1;
	for(int i = 1; i <= n; ++i){
		for(int j = 0; j <= sum; ++j){
			dp[i][j] = dp[i - 1][j];
		}
		for(int j = a[i]; j <= sum; ++j){
			dp[i][j] += dp[i - 1][j - a[i]];
		}
	}
	cout << dp[n][sum] << endl;
}

/*
題意:
給定一個有n個正整數的數組A和一個整數sum,求選擇數組A中部分數字和爲sum的方案數。
當兩種選取方案有一個數字的下標不一樣,我們就認爲是不同的組成方案。

思路:
由於sum比較小,線性dp即可。dp[i][j]表示前i個數和爲j有多少種方案數。討論一下當前數
選不選,轉移一下方程。
*/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章