프로그램 설계 생각 Week3- 작업 번호 A- 선거 문제

선거 문제의 A- 번호

기술

주어, N 양의 정수, 이들의 합계는 K가 S 인 번호 입력 요구 N, K, S, 출력 얼마나 많은 다른 선택을 선택한다.

견본

input:
1
10 3 10
1 2 3 4 5 6 7 8 9 10
output:
4

생각

첫째,이 요소를 제거 요소를 추가 촉진하기 위해, 선택한 번호를 저장하는 목록을 사용, 당신은 또한 선택한 시간의 수를 알 수 있습니다. 그 상황을 고려하여 선택 기간의 각 숫자에 대해, 선택적 순환리스트를 사용하고, 선택되지 않은, 합계에 대응하는 값에 추가 된 각 요소는 감산하여,리스트의 개수 합 때 정확하게 K 같 K리스트의 개수를 초과하거나,이 경우 시간에 다시 합산하지 않을 경우 순환 동안 0, 즉, 규정 된 용액은 0 미만이었다.

요약

기본적인 아이디어는 전체 배열을 위해, 차례로 각각의 부분 집합이 요구 사항을 충족 여부를 결정 열거된다. 복잡성을 감소시키기 위해, 이러한 소자의 수를 초과 K 및 S보다 요소들의 서브 세트의 일부로서 명백하게 확립되지 스킵 선택적 열거 많은 경우이어야 발생할 때 타임 용액 정규화 다시 다음에, 또 때문에 재귀 추가 요소는 해당되지도해야합니다.

코드

#include <iostream>
#include <list>
using namespace std;
int a[16];
int t,n, k, s;
int amount = 0;
void solve(int i,int sum,list<int> &res) {
	if (res.size()==k&&sum == 0) { amount++; return; }
	if (i >= n)return;
	if (res.size()>k||sum < 0)return;

	solve(i + 1, sum,res);
	res.push_back(a[i]);
	solve(i + 1, sum - a[i],res);
	res.pop_back();

}

int main()
{
	cin >> t;
	while (t--)
	{
		amount = 0;
		scanf("%d%d%d", &n, &k, &s);
		memset(a, 0, sizeof(int));
		for (int i = 0; i < n; i++)
			cin >> a[i];
		list<int> r;
		solve(0, s, r);
		printf("%d\n", amount);

	}
}


게시 21 개 원래 기사 · 원 찬양 5 · 조회수 786

추천

출처blog.csdn.net/weixin_44578615/article/details/104711472