首页 > 其他分享 >Record - 多重背包的优化 Trick

Record - 多重背包的优化 Trick

时间:2024-08-22 16:37:32浏览次数:10  
标签:多重 背包 正整数 int Trick Record dp MOD

最多只有 \(1\) 类物品没有用完

CF1442D

多重背包计数的前缀和优化

ARC104D

题面

题目:给出正整数 \(n, k, m\),表示任意正整数 \(i ∈ [1, n]\) 都有 \(k\) 个可供选择,你需要从中选出若干个数组成一个可重集。请计算选出的可重集平均数为 \(x\) 的方案数对 \(m\) 取模后的值,对于所有正整数 \(x ∈ [1, n]\) 求解。

思路

对于平均数为 \(x\) 的情况,相当于在 \([1-x,n-x]\) 中选择一些数使得和为 \(0\),也就是 值属于 \([1-x,-1]\) 的加上属于 \([1,n-x]\) 的为 \(0\)。

设 \(dp_{i,j}\) 表示在 \(1 \sim i\) 中和为 \(j\) 的方案数,由于 \(n,k\) 极小,可以用多重背包计数的前缀和优化,那么答案就是 \((k+1)(\sum_{i=0}^{limit} dp_{x-1,i}dp_{n-x,i})-1\)。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,k,sum,MOD;
int dp[105][505005];
int main(){
    scanf("%d%d%d",&n,&k,&MOD);
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        sum+=i*k;
        memcpy(dp[i],dp[i-1],sizeof dp[i]);
        for(int j=i;j<=sum;j++) (dp[i][j]+=dp[i][j-i])%=MOD;
        int tmp=(k+1)*i;
        for(int j=sum;j>=tmp;j--) (dp[i][j]+=MOD-dp[i][j-tmp])%=MOD;
    }
    for(int i=1;i<=n;i++){
        ll ans=0;
        for(int j=0;j<=sum;j++) (ans+=1ll*dp[i-1][j]*dp[n-i][j]%MOD)%=MOD;
        printf("%lld\n",((k+1)*ans+MOD-1)%MOD);
    }
    return 0;
}

标签:多重,背包,正整数,int,Trick,Record,dp,MOD
From: https://www.cnblogs.com/zengzi/p/18374216

相关文章

  • 背包问题深搜
     背包问题题目描述小明就要去春游了。妈妈给他买了很多好吃的。小明想把这些吃的都放进他的书包,但他很快发现,妈妈买的东西实在太多了,他必须放弃一些,但又希望能带尽可能多的好吃的。举算法解决一些实际问题。已知小明的书包最多可以装入总重量为s的物品,同时也知道小明妈......
  • 背包之分组背包
        分组背包是01背包的进阶问题,但是相对于较为简单,主要难在他的衍生问题。    分组背包就是现有n个物品,将这些物品分成若干组,给你一个容量为v的背包,对于每一个组中的物品,你最多只能选择一个,问哪些物品装入背包可以使得在体积总和不超过容量v的情况下,价值总和最......
  • 面试+算法之动态规划(Java):斐波那契、背包问题、走棋盘、分苹果、连续子数组最大和、
    概述Dynamicprogramming,简称DP,动态规划,基础算法之一,维基百科的解释:是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时......
  • leetcode322. 零钱兑换,完全背包最值问题,附背包问题模板
    leetcode322.零钱兑换给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。示例1:输入:coins=[1,2,5......
  • 01背包问题
    有 NN 件物品和一个容量是 VV 的背包。每件物品只能使用一次。第 ii 件物品的体积是 vivi,价值是 wiwi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,VN,V,用空格隔开,分别表示物品数量和背包容积......
  • Codeforces 232 B Table 题解 [ 蓝 ] [ 分组背包 ] [ 组合数学 ] [ 循环节 ]
    Codeforces232BTable。蒟蒻模拟赛上场切的一道蓝,非常难以置信我竟然能做蓝题。这题的数据范围初看还是比较坑的,\(10^{18}\)的值域很容易让人往矩阵加速那方面想。实际上在列出转移方程式后,我们发现状态是二维的,无法使用矩阵加速(或者说这样做很麻烦)。思路首先观察到每个边长......
  • 【动态规划】0/1背包问题
    题目描述有个背包可承受重量N,现有T件物品每件物品重量为Wi,价值为Vi,每件物品只有一个,这个背包可以装载物品的最大价值是多少?输入从文件 beibao1.in 中读入数据。一行两个正整数NT,之间用空格隔开后面T行,每行两个正整数,分别表示重量Wi,价值Vi输出输出到文......
  • 贪心法-一般背包问题
    一般背包问题问题描述想象你有一个背包,它最多可以放M公斤的物品。你面前有n个物品,每个物品的重量是Wi,如果将这个物品完全放入背包,你将获得Pi的收益。问题目标你需要决定如何放置这些物品,以便在不超过背包容量的前提下,获得最大的收益。问题类型0/1背包问题:每个......
  • CF1984G Magic Trick II 题解
    前记第一篇黑题题解。难调。好写。码量不大。Description给定一个大小为nnn的排列pp......
  • 背包问题 持续更新中!
    背包九讲一、01背包问题题目概览有NNN件物品和一个容量是VVV的背......