【递推+Java大整数】HDU-1297 Children’s Queue

在这里插入图片描述
在这里插入图片描述

注解

1、递推关系。F(n) = F(n-1) + F(n-2) + F(n-4)
2、大整数。

代码

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        BigInteger[] a = new BigInteger[1001];
        a[0] = BigInteger.ONE;
        a[1] = BigInteger.ONE;
        a[2] = new BigInteger("2");
        a[3] = new BigInteger("4");
        for(int i=4; i<a.length; i++){
            a[i] = a[i-1].add(a[i-2]).add(a[i-4]);
        }
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            System.out.println(a[n]);
        }
    }
}

结果

在这里插入图片描述

以下是一个使用C++实现的程序,用于判断给定正整数序列在每个数前插入 +- 号求和后是否至少有一个结果能被指定整数 `k` 整除: ```cpp #include <iostream> #include <vector> using namespace std; // 递归函数,用于生成所有可能的组合并检查是否能被 k 整除 bool canBeDivided(const vector<int>& nums, int index, int currentSum, int k) { if (index == nums.size()) { return currentSum % k == 0; } // 尝试在当前数字前加 + 号 bool plusResult = canBeDivided(nums, index + 1, currentSum + nums[index], k); // 尝试在当前数字前加 - 号 bool minusResult = canBeDivided(nums, index + 1, currentSum - nums[index], k); return plusResult || minusResult; } // 主函数,处理输入并调用递归函数 string checkDivisibility(const vector<int>& nums, int k) { if (canBeDivided(nums, 0, 0, k)) { return "YES"; } return "NO"; } int main() { int n, k; cout << "请输入数字的个数 n 和要被整除的数 k: "; cin >> n >> k; vector<int> nums(n); cout << "请输入 " << n << " 个正整数: "; for (int i = 0; i < n; ++i) { cin >> nums[i]; } string result = checkDivisibility(nums, k); cout << result << endl; return 0; } ``` ### 代码解释: 1. **`canBeDivided` 函数**:这是一个递归函数,用于生成所有可能的组合并检查是否能被 `k` 整除。它接受当前数字的索引 `index`、当前的和 `currentSum` 以及 `k` 作为参数。当 `index` 等于序列的长度时,检查当前和是否能被 `k` 整除。否则,分别尝试在当前数字前加 + 号和 - 号,并递归调用自身。 2. **`checkDivisibility` 函数**:调用 `canBeDivided` 函数,并根据结果返回 "YES" 或 "NO"。 3. **`main` 函数**:处理输入,读取数字的个数 `n`、要被整除的数 `k` 以及 `n` 个正整数。调用 `checkDivisibility` 函数并输出结果。 ### 复杂度分析: - **时间复杂度**:$O(2^n)$,其中 $n$ 是序列的长度。因为每个数字都有两种选择(加 + 号或 - 号),所以总的组合数为 $2^n$。 - **空间复杂度**:$O(n)$,主要是递归调用栈的空间。 ### 注意事项: - 该程序使用递归方法,对于较大的 `n` 值,可能会导致栈溢出。可以考虑使用动态规划方法来优化时间复杂度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值