NOIp2002 选数

1、刚开始把dfs里的num写成n了,居然过了样例,结果只过了一个数据。如果是正式比赛,就杯具了。以后交题前要检查一遍代码,最好自己编几个数据测一测。

#include<cstdio>
#include<cmath>
using namespace std;
int a[25],n,k,ans;
bool is_prime(int num){
   int m=(int)sqrt(num+0.5);
   for(int i=2;i<=m;i++)
    if(num%i==0) return false;
   return true;
}
void dfs(int num,int sum,int cnt){
 if(cnt==k){
     if(is_prime(sum)){
      ans++;
   return;
  }
 }
 if(num==n) return;
    dfs(num+1,sum+a[num],cnt+1);
 dfs(num+1,sum,cnt);
 return;
}
int main(){
 scanf("%d%d",&n,&k);
 for(int i=0;i<n;i++)
  scanf("%d",&a[i]);
    dfs(0,0,0);
 printf("%d\n",ans);
 return 0;
}

### 关于NOIP问题的Python实现 对于NOIP中的问题,通常涉及组合学以及动态规划等高级算法。这类题目旨在考察手对据结构的理解程度和编程能力。 针对此类问题的一个有效解决方案是采用回溯法来枚举所有可能的择情况,并利用剪枝技术减少不必要的计算开销[^1]。具体来说,在遍历过程中如果当前路径已不可能达到更优解,则立即终止这条路径的探索。 下面给出一种基于上述思想的具体实现方式: ```python def find_max_sum(nums, k): n = len(nums) def backtrack(index, count, current_sum): nonlocal max_sum if index >= n or count == 0: if count == 0: max_sum = max(max_sum, current_sum) return # 不择当前位置元素的情况 backtrack(index + 1, count, current_sum) # 择当前位置元素的情况 if nums[index] != -1 and (index == 0 or nums[index] % nums[index - 1] == 0): temp = nums[index] nums[index] = -1 # 标记为已被访问 backtrack(index + 1, count - 1, current_sum + temp) nums[index] = temp # 还原状态 result = [] for i in range(k, min(n + 1, k * 2)): max_sum = float('-inf') backtrack(0, i, 0) result.append(max_sum) return max(result) nums = [int(x) for x in input().split()] k = int(input()) print(find_max_sum(nums, k)) ``` 这段代码实现了从给定组`nums`中出最多不超过`k`个整,使得这些整满足特定条件下的最大和。这里假设输入是一个由空格分隔的一系列整值组成的字符串形式表示的列表 `nums` 和一个正整 `k` 表示可取的最大量[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值