zoukankan      html  css  js  c++  java
  • loj6089 小 Y 的背包计数问题

    link

    吐槽:

    好吧开学了果然忙得要死……不过为了证明我的blog还没有凉,还是跑来更一波水题

    题意:

    有n种物品,第i种体积为i,问装满一个大小为n的背包有多少种方案?

    $nleq 10^5.$

    做法:

    这种题一看就很想按根号分类是不是……

    设阈值大小为$m=sqrt n$,对于体积$leq m$的所有物品,直接跑多重背包:

    f[i][j]表示前i个物品,体积和为j的方案数,$f[i][j]=sum f[i-1][j-ki],kin [0,i]$。

    记录sum[x]表示$sum f[i-1][j]$其中$j\% i=x$,同时需满足当前的j和上一个状态lastj的差$leq i^2$。这样可以把dp优化到$mathcal{O}(nsqrt n)$。

    对于体积$>m$的所有物品,由于$i^2$一定$>n$,所以相当于完全背包:

    但是当然不能直接跑完全背包,复杂度是炸的。可以发现物品的个数不超过$sqrt n$,那么

    g[i][j]表示i个物品,体积和为j的方案数(注意和f的区别),$g[i][j]=g[i][j-i]+g[i-1][j-m-1]$。

    具体来说这个转移表示,要么把当前i个物品每个体积都增加1,要么插入一个体积为m+1的物品(一个构造法,恰好不重不漏地计算了所有方案)。

    复杂度也是$mathcal{O}(nsqrt n)$。

    最后把两者乘法原理合并起来即可。

    题外话:51nod1259是一道类似的题,区别是它都是完全背包,更简单了些。

    code:

     1 #include<bits/stdc++.h>
     2 #define rep(i,x,y) for (int i=(x);i<=(y);i++)
     3 #define ll long long
     4 using namespace std;
     5 #define N 100005
     6 const int mod=23333333;
     7 int n,m,f[2][N],sum[N],g[2][N],now,t,ans;
     8 void upd(int &x,int y){x+=y;x-=x>=mod?mod:0;}
     9 int main(){
    10     cin>>n;m=sqrt(n);now=0;f[0][0]=1;
    11     rep (i,1,m){//f[i][j]:前i个体积<=m的物品,体积和为j的方案数
    12         now^=1;memset(sum,0,sizeof(sum));
    13         rep (j,0,n){
    14             upd(f[now][j]=f[now^1][j],sum[j%i]);upd(sum[j%i],f[now^1][j]);
    15             if (j>=i*i) upd(sum[j%i],mod-f[now^1][j-i*i]);
    16         }
    17     }
    18     ans=f[now][n];t=now;
    19     g[0][0]=1;now=0;
    20     rep (i,1,m){//g[i][j]:i个体积都>m的物品,体积和为j的方案数
    21         now^=1;memset(g[now],0,sizeof(g[now]));
    22         rep (j,i,n){
    23             upd(g[now][j],g[now][j-i]);
    24             if (j>=m+1) upd(g[now][j],g[now^1][j-m-1]);
    25         }
    26         rep (i,0,n) upd(ans,(ll)f[t][i]*g[now][n-i]%mod);
    27     }
    28     cout<<ans;
    29     return 0;
    30 }
    View Code
  • 相关阅读:
    hive与hbase整合
    待重写
    hive DML
    【知识强化】第六章 总线 6.1 总线概述
    【知识强化】第五章 中央处理器 5.1 CPU的功能和基本结构
    【知识强化】第四章 指令系统 4.3 CISC和RISC的基本概念
    【知识强化】第四章 指令系统 4.2 指令寻址方式
    【知识强化】第四章 指令系统 4.1 指令格式
    【知识强化】第三章 存储系统 3.6 高速缓冲存储器
    【知识强化】第三章 存储系统 3.5 双口RAM和多模块存储器
  • 原文地址:https://www.cnblogs.com/bestFy/p/9672558.html
Copyright © 2011-2022 走看看