질문의 의미 :
n은 양의 정수 감안할 때 K는 K 번호가 결정 S, 얼마나 많은 프로그래밍 접근 방식 그래서 것을 골라.
입력 :
첫 줄 T (T <= 100) 정수 양을 제공 T는 데이터 세트를 나타낸다. 다음으로, 두 개의 라인을 통해 데이터의 각 세트는, 첫번째 라인은 해당 세 숫자 N, K, S 의도된다 제공 둘째 행은 N 개의 양의 정수를 준다.
샘플 입력 :
1
10 3 10
1 2 3 4 5 6 7 8 9 10
출력 :
데이터의 각 세트를위한 프로그램의 수, 각 라인 당 출력을 나타내는 정수를 출력한다.
샘플 출력 :
4
아이디어 :
상기 K에서 문제 N 번호의 선출하도록하고 S는 각 번호를 선택하고 그래서 상황 2 ^ N 가지가 있는데, 두 경우 모두에서 선정 아니지만, 높은 복잡도 열거 및 S보다 더 갖거나 카운트 수가 K 이상이다 불합리 같은 직접 제거하는 경우에 필요한. 이 경우, 선택 과정을 배제 할 수있다. 따라서, 재귀 적 방법을 이용하여, 개수 n을 순차적으로 선택하여 바로 뒤에 병리 경우 순환 공정에, 판정 선택되지 재귀 분기 조건 인 경우에 만족 정지 카운트 변수 이전에 하나, 반환, 당신은 모든 데이터를 선택할 때까지.
오류 :
선택된 데이터 세트의 수 (N)의 종료 후, 비우는 보존 용기되지 않도록 충돌 오류의 결과 데이터의 다음 세트 전에 데이터의 그룹.
코드 :
#include <iostream>
#include<vector>
using namespace std;
int N,M,SUM;
vector<int> val;
int count=0;
void select(int i,int thesum,vector<int>&arr)
{
if(arr.size()==M)
{
if(thesum==0)
count++;
return;
}
if(i>=N||thesum<0)
return;
select(i+1,thesum,arr);
arr.push_back(val[i]);
select(i+1,thesum-val[i],arr);
arr.pop_back();
}
int main(int argc, char** argv) {
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
val.clear();
count=0;
vector<int> arr;
scanf("%d%d%d",&N,&M,&SUM);
for(int j=0;j<N;j++)
{
int temp;
scanf("%d",&temp);
val.push_back(temp);
}
select(0,SUM,arr);
if(i==0)
printf("%d",count);
else
printf("\n%d",count);
}
return 0;
}