[프로그래밍 사고와 실천 Week3 작업] 선거 문제의 수

질문의 의미 :

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;
}
게시 25 개 원래 기사 · 원 찬양 8 · 조회 543

추천

출처blog.csdn.net/weixin_44034698/article/details/104716796