애니리뷰

조합 dfs 형식으로 풀기

두원공대88학번뚜뚜 2021. 10. 1. 01:02
#include<iostream>
#include <vector>
#define MAX 17000000
#define CITY 16

using namespace std;

int ans = 0;

//배열, 목표숫자, index, 현재 숫자
void dfs(vector<int> v, int num, int idx, int cur) {

	//나가는 시점: 맞을 때, 초과할 때, 끝에 다다랐을 때
	if (cur == num) {
		ans++;
		return;
	}
	if (cur > num || idx >= v.size()) {
		return;
	}
	
	for (int i = idx + 1; i < v.size(); i++) {
		cur += v[i];
		dfs(v, num, i, cur);
		cur -= v[i];
	}
}

int solve(vector<int> v, int num)
{
	int ret = 0;
	for(int i=0; i<v.size(); i++)
		dfs(v, num, i, v[i]);

	return ret;
}

int main()
{
	vector<int> v = { 1, 2, 4, 5 };
	solve(v, 6);
	cout << ans << "\n";
	ans = 0;

	v = { 1, 3, 4, 7, 8 };
	solve(v, 7);
	cout << ans << "\n";
	ans = 0;

	solve(v, 8);
	cout << ans << "\n";
	ans = 0;
	return 0;
}