寒武紀演算法開發崗位二面手撕程式碼題目記錄

我有一隻大鵝發表於2020-11-14

寒武紀演算法開發崗位二面手撕程式碼題目記錄
該程式碼是寒武紀的二面面試題:

題目:

給定一個陣列,求能組成的和中,最小不可能的和。
例如:[1,2,3,5],最小不可能的和為12。

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;


int minNoSum(vector<int>& data) {
	int n = data.size();
	if (n == 0) return 0;
	if (n == 1) return 1;

	int minv = INT_MAX;
	int sum = 0;

	sort(data.begin(), data.end());

	for (int i = 0; i < n; ++i) {
		if (data[i] < minv) minv = data[i];
		sum += data[i];
	}

	// dp[i][j]表示前i個數,和為j是否能取到
	vector<vector<bool>> dp(n, vector<bool>(sum+1, 0));

	for (int num : data) {
		dp[0][num] = 1;
	}

	for (int i = 1; i < n; ++i) {
		for (int j = 1; j <= sum; ++j) {
			if (j >= data[i]) {
				dp[i][j] = dp[i-1][j] || dp[i-1][j-data[i]];
			}
			else {
				dp[i][j] = dp[i - 1][j];
			}
		}
	}

	for (int i = 1; i < sum; ++i) {
		if (!dp[n - 1][i]) return i;
	}
	return sum + 1;
}



int main()
{
	vector<int> data = {1,2,4,5};
	int res = minNoSum(data);
	cout << res << endl;

	system("pause");
	return 0;
}

 

相關文章