数学与简单DP

本文探讨了如何运用数学归纳法寻找规律解决数学问题,并深入讲解了动态规划思想,特别是01背包问题。文章通过实例分析了01背包、完全背包、多重背包和分组背包问题的状态表示和计算方法,强调了DP优化的重要性,并提供了几个典型DP问题的案例,如最长上升子序列和地宫取宝问题。
摘要由CSDN通过智能技术生成

数学
数学题一般应用某种定理或公式,这是我们要尽力去分析–用数学归纳法找出其中规律。对于一些简单数字可以采用打表计数得出一些序列观察其中存在的规律

1205.买不到的数目
在这里插入图片描述

// 演算
#include<bits/stdc++.h>

using namespace std;

const int N = 1010;

int m, n;   //表示每种包装中糖的数量

bool dfs(int m, int p, int q)
{
   
    if(!m) return true; // m 为0 --true 表示递归过程中 m 被全部分解为<p, q> 倍数的糖果数量
    
    // 放缩-- m 递归递减 p, q 倍数直到 当递减到 m(min) < p q,说明m无法被分解<p,q> 倍数
    if(m >= p && dfs(m - p, p, q)) return true;  
    if(m >= q && dfs(m - q, p, q)) return true;
    return false;
}

int main()
{
   
    cin >> n >> m;
    int res = 0;    // 记录最大不能买到的糖数
    
    // 从 1 ~ 1000 暴力枚举出 <p, q> 不能买到的最大糖果数
    // 这里只是简单演算一些数值规律
    for(int i = 1; i <= 1000; i ++ )
    {
   
        if(!dfs(i, m, n)) res = i;   // dfs判断 i 是否满足最大不能按<p, q> 买到的数
    }
    cout << res << endl;
    return 0;
}
/*
m n 最大不能÷<p,q>数
3 7 11
3 8 13
tmd超时了……
*/
#include <iostream>

using namespace std;

int main()
{
   
    int m, n;
    cin >> m >> n;
    
    int k = m * n;  // 最大不能整除 <m, n> 的数一定 < m * n
    
    while(k--)
    {
   
        int t = k;  // t 存放判断前的 k 
        
        // 判断 k 不能组成 k = x * m + y * n 形式
        while(t % m != 0 && t - n >0) t -= n;  // k 在不能被 m 单除基础上 减去 n 倍数到最小值,即 k 无法被 n 单除
        
        if(t % m != 0 && k % n !=0 && k % m != 0 )  // 上述两个条件再判断一下
        {
   
            printf("%d\n", k);
            break;
        }
    }
}

1211.蚂蚁感冒
在这里插入图片描述
分析
在这里插入图片描述

#include <bits/stdc++.h>

using namespace std;

const int N = 55;  

int n;
int x[N];

int main()
{
   
    cin >> n;
    for(int i = 0; i < n; i ++ ) cin >> x[i];
    
    int left = 0, right = 0;    // 分别表示左边向右走的蚂蚁数量和右边向左走的蚂蚁数量
    for(int i = 0; i < n; i ++ )
    {
   
        if(abs(x[i]) < abs(x[0]) && x[i] > 0) left ++
  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值