선거 문제의 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);
}
}