组合数|动态规划|背包问题

本文探讨了组合数学中的基本概念,如无重复组合数,并通过代数系统和动态规划的方法,解释了01背包问题的两种形式,包括固定重量和价值问题的求解策略。文中还提及了帕斯卡恒等式的转移方程和模系下的组合数计算方法。
摘要由CSDN通过智能技术生成

子曰.“古者言之不出,

耻躬之不逮也。”

孔子说:“君子从不轻易地发表言论,他们以说了而做不到为可耻。

摘要:本文从组合数学的角度,引用代数系统的知识,系统阐述了无重复的组合数和01背包转换。组合数是组合数学中最基础的函数,它是关于子集的枚举,我们会扩展子集的合并。

关键词:组合数学 算法 动态规划

代数系统

最简单的代数系统就是在自然数集中的加法。

如果将一个代数系统看成一个国家/集合,那么A就是这个国家的人,而运算就是道德或者法律构建的关系。

比如说婚姻,劳资,教学的关系。

算两次思想(富比尼原理)

在程序中,相当于改变了循环变量枚举层数。

for(int i=1;i<=n;i++)
  {
    for(int j=1;j<=n;j++)
    {
      sum+=a[i][j];
    }
  }
  for(int j=1;j<=n;j++)
  {
    for(int i=1;i<=n;i++)
    {
      sum+=a[i][j];
    }  
  }

最基础的组合数-无重复组合

帕斯卡恒等式是转移方程的原型。

如果我们是在模系下,求解出组合数。

int qmi(int a,int x)
{
    int res=1;
    while(x)
    {
        if(x&1)
            (res=a*res)%=mod;
        a=(a*a)%mod;
        x>>=1;
    }
    return res;
}
void init()
{
    fac[0]=1;
    for(int i=1;i<=N;i++)
    {
        (fac[i]=fac[i-1]*i)%=mod;
         
  
    }
      
    inv[N]=qmi(fac[N],mod-2);
      
    for(int i=N-1;i>=0;i--)
    {
        inv[i]=(inv[i+1]*(i+1)%mod);
        inv[i]%=mod;
      
    }
}
int C(int n,int m)
{
    return fac[n]*inv[n-m]%mod*inv[m]%mod;
}

for(int i=0;i<N;i++)
  {
    for(int j=0;j<=i;j++)
    if(!j)c[i][j]=1;
    else c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
  }

01背包

我们还是从组合数开始谈起,

有n个物品,背包容量为V,物品的重量为1,物品的价值为1

求出最终选择物品的重量为k的方案数。

有n个物品,背包容量为V,物品的重量为1,物品具有价值v

求出最终背包的重量不超过V的最大价值。

有n个物品,背包容量为V,物品的重量为w,物品具有价值v

求出最终背包的重量不超过V的最大价值。

for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= V; j++) {
      f[i][j] = f[i - 1][j];
      if (j >= w[i])
        f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + v[i]);
    }
 }

引用:

张垚,孔令志编. 数学奥林匹克小丛书 组合数学. 上海:华东师范大学出版社, 2020.04

左孝凌,李为鑑,刘永才编. 离散数学. 上海:上海科学技术文献出版社, 1982.09.

罗勇军,郭卫斌著. 算法竞赛 下. 北京:清华大学出版社, 2022.10.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值