首页 > 其他分享 >有限背包计数问题

有限背包计数问题

时间:2024-07-21 22:07:19浏览次数:11  
标签:背包 int 有限 sqrt Html 计数问题 include

https://class.51nod.com/Html/Textbook/ChapterIndex.html#chapterId=335&textbookId=126

https://class.51nod.com/Html/Challenge/Problem.Html#problemId=1597

如有限背包计数问题

发现对于物品 \(i\) 最多填充 \(i*i\),而对于 \(i>\sqrt n\) 可以视为完全背包,所以我们分为两类。

对于小的那一类,可以用临时数组维护对应余数的和(像多重背包一样),然后超出范围的再减去。

大的那一类,考虑每次添加一个新的数或者让所有数+1(这样就能涵盖所有的情况,所有数+1相当于偏移,你想让它等于多少,就在最后一个数加入前特定时间加入即可)。

复杂度 \(O(n\sqrt n)\)。

#include<iostream>
#include<cmath>
#include<cstring>
#define add(a,b) (a+=b)>=mod&&(a-=mod)
#define sub(a,b) (a-=b)<0&&(a+=mod)
using namespace std;
const int N=100010,mod=23333333,Q=320;
int n,q,tmp[Q],f[2][N],g[2][N];
int main(){
    #ifdef LOCAL
    freopen("1.txt","r",stdin);
    #endif
    #ifndef LOCAL
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    #endif
    cin>>n;
    q=sqrt(n)+1;
    f[0][0]=1;
    for(int i=1;i<q;++i){
        int I=i&1,L=!I;
        memset(tmp,0,i*4);
        int mo=-1;
        for(int j=0;j<=n;++j){
            ++mo;
            if(mo==i)mo=0;
            add(tmp[mo],f[L][j]);
            f[I][j]=tmp[mo];
            if(j>=i*i)sub(tmp[mo],f[L][j-i*i]);//can't reach
        }
    }
    int qq=(q-1)&1;
    // for(int i=1;i<q;++i,puts(""))
    //     for(int j=0;j<=n;++j)
    //         cout<<f[i][j]<<' ';
    g[0][0]=1;
    int ans=f[qq][n],nq=n/q;
    for(int i=1;i<=nq;++i){int I=i&1,L=!I;
        g[I][0]=0;
        for(int j=q;j<=n;++j){
            g[I][j]=g[L][j-q];
            add(g[I][j],g[I][j-i]);
            add(ans,1ll*g[I][j]*f[qq][n-j]%mod);
        }}
    cout<<ans;
    return 0;
}

标签:背包,int,有限,sqrt,Html,计数问题,include
From: https://www.cnblogs.com/wscqwq/p/18315036

相关文章

  • C++分组背包问题_动态规划dp_背包_算法竞赛
    OIWiki上的详细讲解模型总结分组背包的问题模板:有nnn件物品和一个大小为mm......
  • lua开发:有限状态机模式设计
    有限状态机,表示有限个状态以及在这些状态之间的转移和动作等行为的处理模型。在任意时刻有限状态机都处于某一特定的状态,并且可以根据当前状态和输入条件(触发事件),从当前状态转移到另一个状态。核心概念:实体(Entity):状态机的主体和作用对象,它的状态可以改变状态(State):实体在某......
  • dp-完全背包
    解释完全背包模型与0-1背包类似,与0-1背包的区别仅在于一个物品可以选取无限次,而非仅能选取一次。我们可以借鉴0-1背包的思路,进行状态定义:设$f_{i,j}$为只能选前i个物品时,容量为j的背包可以达到的最大价值。需要注意的是,虽然定义与0-1背包类似,但是其状态转移方程与......
  • dp-01背包
    01背包问题是动态规划中的一个经典问题,通常用于解决资源分配问题。问题描述如下:假设有一个背包,其最大承重为$W)。同时,有$n)个物品,每个物品有一个重量$w_i)和一个价值$v_i)。目标是选择一些物品放入背包,使得在不超过背包承重的前提下,背包中物品的总价值最大。问题......
  • 问题 U: 0/1背包
    题目描述       一个旅行者有一个最多能用m公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn.若每种物品只有一件求旅行者能获得最大总价值。输入w第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);w  第2..N+1行:每行二个整数......
  • 分组背包
    先给出题目吧通天之分组背包题目背景直达通天路·小A历险记第二篇题目描述自\(01\)背包问世之后,小A对此深感兴趣。一天,小A去远游,却发现他的背包不同于\(01\)背包,他的物品大致可分为\(k\)组,每组中的物品相互冲突,现在,他想知道最大的利用价值是多少。输入格式两个......
  • DP-背包问题-0/1背包
    第一次写blog,不好见谅!今天主要记录在学习背包时的感想以及个人理解。0/1背包疯狂的采药题目背景此题为纪念LiYuxiang而生。题目描述LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一......
  • 动态规划+0-1背包问题
    一、问题描述小明周末要参加学校组织的跳蚤市场活动,他准备了足球、旱冰鞋、随身听和单词书四件物品进行交易,要用他的书包把这些物品带到学校。各物品的重量w和价值v如下图所示,小明书包的最大承重量为9(忽略单位),请你帮助他找到最合理的搭配方案,使他能用书包带到学校的物品价值最......
  • 代码随想录算法训练营第六十六天 | Bellman_ford 队列优化算法(SPFA)、Bellman_ford之
    Bellman_ford队列优化算法(SPFA)题目链接:https://kamacoder.com/problempage.php?pid=1152文档讲解:https://programmercarl.com/kamacoder/0094.%E5%9F%8E%E5%B8%82%E9%97%B4%E8%B4%A7%E7%89%A9%E8%BF%90%E8%BE%93I-SPFA.html思路Bellman_ford算法每次松弛都是对所......
  • 动态规划中01背包问题
    动态规划中01背包问题:这记录一下自己的思考和总结:详细讲解:添加链接描述这种题目中有两种解题方法一是二维数组dp[i][j]表示0-i区间背包容量为j的最大价值那么可以有两个方向推出来dp[i][j],不放物品i:由dp[i-1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][......