数组查找k个数的组合

[NOIP2002 普及组] 选数 - 洛谷

#include<bits/stdc++.h>
using namespace std;
vector<int> results;
vector<int> combination;
vector<int>arr;
void find(int k, int start)
{
	if (combination.size() == k)
	{
		int sum = 0;
		for (int num : combination)
		{
			sum += num;
		}
		results.push_back(sum);
		return;
	}
	for (int i = start;i < arr.size(); i++)
	{
		combination.push_back(arr[i]);
		find(k, i + 1);
		combination.pop_back();
	}
}




bool isPrime(int num) {
	if (num <= 1) return false;
	if (num <= 3) return true;
	if (num % 2 == 0 || num % 3 == 0) return false;
	for (int i = 5; i * i <= num; i += 6) {
		if (num % i == 0 || num % (i + 2) == 0) return false;
	}
	return true;
}

int main()
{
	int n, k;
	cin >> n >> k;
	arr = vector<int>(n, 0);
	for (int i = 0; i < n; i++)
	{
		cin >> arr[i];
	}
	find(k, 0);
	int cnt = 0;
	for (int sum : results)
	{
		if (isPrime(sum))
			cnt++;
	}
	cout << cnt;
}

P1460 [USACO2.1] 健康的荷斯坦奶牛 Healthy Holsteins - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include<bits/stdc++.h>
using namespace std;
vector<int>vrr;
vector<vector<int>>arr;
vector<int>combination;
vector<int>yanzheng;
int v, g;
void find(int k, int start)
{
	if (combination.size() == k)
	{
		for (int num : combination)
		{
			for (int i = 0; i < v; i++)
			{
				yanzheng[i] +=arr[num][i];
			}
		   
		}
		int cnt = 0;
		for (int i = 0; i < v; i++)
		{
			if (yanzheng[i] >= vrr[i])
			{
				cnt++;
			}
		}
		if (cnt == v)
		{
			cout << k << " ";
			for (int num : combination)
			{
				cout << num+1 << " ";
			}
			exit(0);
		}
		yanzheng = vector<int>(v, 0);
		return;

	}

	for (int i = start; i < g; i++)
	{
		combination.push_back(i);
		find(k, i + 1);
		combination.pop_back();
	}
}



int main()
{
	cin >> v;
	vrr=vector<int>(v, 0);
	yanzheng = vector<int>(v, 0);
	for (int i = 0; i < v; i++)
	{
		cin >> vrr[i];
	}
	cin >> g;
	arr=vector<vector<int>>(g, vector<int>(v, 0));
	for (int i = 0; i < g; i++)
	{
		for (int j = 0; j < v; j++)
		{
			cin >> arr[i][j];
		}
	}
	for (int i = 1; i <= g; i++)
	{

		find(i, 0);
		
		combination.clear();
	}



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值