foj1695 队员选拔问题
2015-08-14 18:09
253 查看
Problem Description
寒假期间,对参加ACM有兴趣的同学们纷纷练习了很多题目。开学后,他们把自己做题的题目数量和题号发给ths。
(以下内容纯属虚构)可由于人员太多,而参加名额有限,daxia就提出了一个计算成绩的方法:
一个同学完成的n道题中,选择任意数量的题号相加,从而能得到的不同素数的个数,就是这个同学的做题成绩。
现在,让给你写一个程序来帮忙计算做题的成绩。
Input
输入有多组数据,每组数据有两行。第一行有一个整数n(不超过50),表示做题数。第二行有n个整数,表示题号(不超过1000,保证不重复)。最后以一个负数表示输入结束,不需要处理。
Output
对每一组数据输出一行结果,输出上述的做题成绩。
Sample Input
2
1 2
-1
Sample Output
2
思路:打一个50000以内的素数表。通过dp数组把n个数所有的可能和求出来。如果是素数就使结果加一。
代码:
寒假期间,对参加ACM有兴趣的同学们纷纷练习了很多题目。开学后,他们把自己做题的题目数量和题号发给ths。
(以下内容纯属虚构)可由于人员太多,而参加名额有限,daxia就提出了一个计算成绩的方法:
一个同学完成的n道题中,选择任意数量的题号相加,从而能得到的不同素数的个数,就是这个同学的做题成绩。
现在,让给你写一个程序来帮忙计算做题的成绩。
Input
输入有多组数据,每组数据有两行。第一行有一个整数n(不超过50),表示做题数。第二行有n个整数,表示题号(不超过1000,保证不重复)。最后以一个负数表示输入结束,不需要处理。
Output
对每一组数据输出一行结果,输出上述的做题成绩。
Sample Input
2
1 2
-1
Sample Output
2
思路:打一个50000以内的素数表。通过dp数组把n个数所有的可能和求出来。如果是素数就使结果加一。
代码:
#include<iostream> #include<cstdio> using namespace std; int prime[50005]={0}; int main() { //打素数表 for(int i=2;i<=50000;i++) { if(prime[i]==0) for(int j=2*i;j<=50000;j+=i) prime[j]=1; } prime[0]=1; int n; while(scanf("%d",&n)&&n>=0) { int a[55],sum=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; } int dp[50005]={0}; dp[0]=1; //求n个数可能的和 for(int i=1;i<=n;i++) { for(int j=sum-a[i];j>=0;j--) { if(dp[j]==1) dp[j+a[i]]=1; } } int res=0; for(int i=2;i<=sum;i++) { if(dp[i]&&prime[i]==0) res++; } printf("%d\n",res); } return 0; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow
- zoj3605 Find the Marble(三维dp)
- Word Break I,II, Triangle,Palindrome Partitioning 动态规划 DP
- Unique Paths I,II, Minimum Path Sum
- Gas Station