Score

 avatar
ptrdung
plain_text
2 months ago
2.3 kB
1
Indexable
Never
Score
Có N vị giám khảo trong kỳ thi chọn đội tuyển tin học. Kỳ thi bao gồm K bài. Vị giám khảo thứ i đề nghị số điểm của bài j là Aịj.

Hội đồng giám khảo muốn xác định số điểm cho mỗi bài sao cho:

Tổng số điểm bằng S.

Điểm của mỗi bài không bé hơn điểm của bài trước đó.

Số điểm của mỗi bài bằng điểm đề nghị cho bài này của một vị giám khảo nào đó.

 

Input

Dòng đầu tiên chứa số nguyên T là số testcase (T ≤ 100). Trong đó mỗi testcase sẽ chứa:

Dòng đầu chứa ba số nguyên S, K, N (1 ≤ S ≤ 200), (1 ≤ K ≤ 20), (1 ≤ N ≤ 20).

Dòng thứ i trong số N dòng tiếp theo chứa K số nguyên, số thứ j cho biết giá trị Aij là số điểm vị giám khảo thứ i đề nghị cho bài thứ j. (1 ≤ Aij ≤ 100),

 

Output

Kết quả của mỗi testcase sẽ được in theo định dạng sau:

Dòng đầu tiên là: “Case number_testcase”

Nếu tồn tại một cách cho điểm thỏa mãn yêu cầu in ra số trường hợp thỏa mãn.

Nếu không tồn tại cách cho điểm, in ra -1.

 

Sample

Input

2

100 3 2

30 20 40

50 30 50

100 2 3

1 1

2 2

3 3

 

Output

Case 1

1

Case 2

-1

#include<iostream>
using namespace std;
#define pii pair<int,int>
#define piii pair<pii,int>
const int mn =2e3+6;
const int maxS = 2e6+6;
int a[mn][mn],no[mn];
int n,res,k,s;
int check;
void Try(int sl,int sum)
{
	if(sl==k+1)
	{
		if(sum==s)
			{
				/*for(int i=1;i<=k;i++)
					cout<<a[no[i]][i]<<' ';*/
				check+=1;
		}
		return;
	}
	for(int i=1;i<=n;i++)
	{
		no[sl]=i;
		if(a[i][sl]>=a[no[sl-1]][sl-1]&&s>=sum+a[i][sl])
		Try(sl+1,sum+a[i][sl]);
	}
}
int main()
{
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	freopen("input.txt","r",stdin);
	//freopen(".out","w",stdout);
	int te=10;
	cin>>te;
	for(int tes=1;tes<=te;tes++)
	{
		cout<<"Case "<<tes<<"\n";
		check=-1;
		res=0;
		cin>>s>>k>>n;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=k;j++)
				cin>>a[i][j];
		Try(1,0);
		if(check>-1)check++;
		cout<<check<<'\n';
	}
	return 0;
}
Leave a Comment