Loading
NOIP2005 普及组 采药
NOIP2006普及組 開心的金明

NOIP2002普及組 選數

Freddy posted @ 2011年10月08日 02:49 in NOIP with tags c++ NOIP 深度優先搜索 , 1377 阅读

[问题描述]:


已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:
3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29)。
[输入]:
键盘输入,格式为:
n , k (1<=n<=20,k<n)
x1,x2,…,xn (1<=xi<=5000000)

[输出]:
格式为:一个整数(满足条件的种数)。
 
[输入输出样例]:
输入:choose.in
4 3
3 7 12 19
输出:choose.out
1

【分析】
排列組合問題,直接深度優先搜索(遞歸)即可。

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int sum=0;//當前總和
int num[21];
int n,k;
int tot=0;

bool prime(int num)
{
	if (num==1)return false;
	for (int i=2;i<=(int)sqrt(double(num));i++)
		if (num%i==0)
			return false;
	return true;	
}


void dg(int dep,int loc)
{
	if(k-dep>n-loc) return;
	if (dep==k+1)
	{
		if (prime(sum))
			tot++;
	}
	if (dep<k+1)
	{
		for (int i=loc;i<=n;i++)
		{
			sum+=num[i];
			dg(dep+1,i+1);
			sum-=num[i];
		}
	}
}

int main()
{
	freopen("choose.in","r",stdin);
	freopen("choose.out","w",stdout);
	cin>>n>>k;
	for (int i=1;i<=n;i++)
		cin>>num[i];
	dg(1,1);
	cout<<tot<<endl;
	return 0;
}

正在连接评测机...

 

已连接到评测机

GRID 1
名称 Flitty
系统版本 1.00
备注 COGS 1号评测机 Flitty

正在编译...

编译成功

 

测试点 结果 得分 运行时间 内存使用 退出代码
1 正确 20 0.026 s 275 KB 0
2 正确 20 0.001 s 275 KB 0
3 正确 20 0.001 s 275 KB 0
4 正确 20 0.001 s 275 KB 0
5 正确 20 0.001 s 275 KB 0

运行完成

运行时间 0.028 s

平均内存使用 275 KB

测试点通过状况 AAAAA

得分:100

恭喜你通过了全部测试点!



登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter