acdream A - A Math game

本文介绍了一种通过深度优先搜索解决特定数学游戏的算法。游戏中玩家需从一组数中挑选若干数,使其总和等于给定的目标值。文章提供了一个示例程序,使用递归实现的深度优先搜索来判断是否存在一种选择方案使总和达到目标值。




A - A Math game

Time Limit:  2000/1000MS (Java/Others)     Memory Limit:  256000/128000KB (Java/Others)
Problem Description
Recently, Losanto find an interesting Math game. The rule is simple: Tell you a number   H, and you can choose some numbers from a set {a[1],a[2],......,a[n]}.If the sum of the number you choose is   H, then you win. Losanto just want to know whether he can win the game.
Input
There are several cases.
In each case, there are two numbers in the first line   n  (the size of the set) and   H. The second line has n numbers {a[1],a[2],......,a[n]}. 0<n<=40, 0<=H<10^9, 0<=a[i]<10^9,All the numbers are integers.
Output
If Losanto could win the game, output "Yes" in a line. Else output "No" in a line.
Sample Input
10 87
2 3 4 5 7 9 10 11 12 13
10 38
2 3 4 5 7 9 10 11 12 13
Sample Output
No
Yes

dfs,每个数字根据选与不选深搜,当当前和大于H或当前和加上剩余和小于H直接跳出。




#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

int n;
long long m;
long long num[100];
long long sum[100];
bool f;
void dfs(int x,long long s)
{
 if (s==m){
  f=true;return;
 }
 if (f) return;
 if (s>m||x==n) return;
 if (sum[n-1]-sum[x]+s+num[x]<m)
  return;
 dfs(x+1,s+num[x]);
 dfs(x+1,s);
}
int main()
{
 int i,j;
 while (scanf("%d%lld",&n,&m)!=EOF)
 {
  for (i=0;i<n;i++)
   scanf("%lld",&num[i]);
  memset(sum,0,sizeof(sum));
  sum[0]=num[0];
  for (i=1;i<n;i++)
   sum[i]=sum[i-1]+num[i];
  f=false;
  dfs(0,0);
  if (!f) printf("No\n");
  else printf("Yes\n");
 }
 
}




内容概要:本文系统介绍了标准化和软件知识产权的基础知识,涵盖标准化的基本概念、分类、标准代号、国际标准的采用原则及程度,重点讲解了信息技术标准化、ISO与IEC等国际标准化组织以及ISO9000和ISO/IEC15504等重要标准体系;在知识产权部分,详细阐述了知识产权的定义、分类及特点,重点分析了计算机软件著作权的主体、客体、权利内容、行使方式、保护期限及侵权认定,同时涉及商业秘密的构成与侵权形式、专利权的类型与申请条件,以及企业如何综合运用著作权、专利、商标和商业秘密等方式保护软件知识产权。; 适合人群:从事软件开发、项目管理、IT标准化或知识产权相关工作的技术人员与管理人员,以及备考相关资格考试的学习者;具备一定信息技术背景,希望系统掌握标准化与软件知识产权基础知识的专业人员。; 使用场景及目标:①帮助理解各类标准的分类体系及国际标准采用方式,提升标准化实践能力;②指导企业在软件研发过程中有效保护知识产权,规避法律风险;③为软件著作权登记、专利申请、技术保密等提供理论依据和操作指引。; 阅读建议:建议结合国家相关政策法规和实际案例进行深入学习,重点关注软件著作权与专利权的适用边界、标准制定流程及企业知识产权管理策略,强化理论与实践的结合。
编译器优化选项 `-ffast-math` 是一种用于提高浮点运算性能的优化标志,通常用于对性能要求较高但对浮点运算精度要求相对较低的场景。该选项会启用一系列优化策略,这些策略可能会违反 IEEE 754 浮点数运算标准,从而导致计算结果与严格按照标准执行的结果有所不同。 ### `-ffast-math` 的行为 当启用 `-ffast-math` 选项时,编译器将放松对浮点运算的严格要求,允许以下几种优化行为: - **忽略浮点数的特殊值处理**:例如 NaN(Not a Number)和无穷大(Infinity)可能不会被正确处理。 - **重新排列浮点运算表达式**:通过改变运算顺序来提高性能,但这可能导致精度损失。 - **假设没有非正规数(denormals)**:非正规数的处理通常较慢,启用此选项后编译器可以忽略这些特殊情况。 - **允许使用更快速但不精确的数学函数实现**:例如 `sin`、`cos`、`sqrt` 等函数可能会被替换为更快但精度较低的版本。 这些优化通常会显著提升程序的性能,特别是在科学计算、图像处理、游戏引擎等对浮点计算密集型的应用中。 ### `-ffast-math` 的使用场景 该选项通常用于以下场景: - **高性能计算(HPC)**:在需要大量浮点运算且对精度容忍度较高的场合。 - **图形渲染和游戏开发**:对于视觉效果而言,微小的精度误差通常不会影响最终用户体验。 - **机器学习推理**:模型推理阶段对速度要求较高,而训练阶段通常不使用此选项以保证数值稳定性。 在使用 `-ffast-math` 时,开发者需要权衡性能提升与数值精度之间的关系。如果应用程序对浮点数的精度要求较高,例如金融计算或某些嵌入式控制系统,则不建议使用此选项。 ### 编译器支持 主流编译器如 GCC 和 Clang 均支持 `-ffast-math` 选项。在 GCC 中,启用方式如下: ```bash gcc -ffast-math -O3 program.c -o program ``` 在 Clang 中使用方式类似: ```bash clang -ffast-math -O3 program.c -o program ``` 需要注意的是,`-ffast-math` 通常与 `-O3` 一起使用,因为 `-O3` 启用了最高级别的优化[^2]。 ### 示例代码 以下是一个简单的浮点运算示例,展示在启用 `-ffast-math` 后可能的行为变化: ```c #include <stdio.h> #include <math.h> int main() { float a = 1e20f; float b = 1.0f; float c = (a + b) - a; printf("Result: %f\n", c); return 0; } ``` 在未启用 `-ffast-math` 时,结果可能为 `1.000000`;而在启用该选项后,由于编译器可能优化掉加法的顺序,结果可能变为 `0.000000`。 ### 注意事项 - 在使用 `-ffast-math` 时应进行充分测试,确保其不会影响程序的逻辑正确性。 - 可以结合 `-fno-fast-math` 来禁用该行为,以恢复 IEEE 754 兼容性。 - 若仅需部分功能,可使用更细粒度的标志如 `-funsafe-math-optimizations`、`-ffinite-math-only` 等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值