题解【AcWing279】自然数拆分

题解【AcWing279】自然数拆分

标签(空格分隔): DP 背包



题面

因为题目中说参与加法运算的数可以重复,由此可以想到完全背包计数问题。

完全背包计数问题与 \(01\) 背包计数问题只有一个不同: \(01\) 背包计数问题的第二维循环是倒叙循环,而完全背包计数问题的第二维循环是正序循环。

这涉及到的是循环时后效性的问题,具体的证明留给读者思考。

注意每一步计数都要取模,且最后输出要减去只有 \(n\) 一个数的一组解。

#include <bits/stdc++.h>
#define DEBUG fprintf(stderr, "Passing [%s] line %d\n", __FUNCTION__, __LINE__)
#define itn int
#define gI gi

using namespace std;

typedef long long LL;
typedef pair <int, int> PII;
typedef pair <int, PII> PIII;

inline int gi()
{
    int f = 1, x = 0; char c = getchar();
    while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
    while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return f * x;
}

const int maxn = 4003;

int n;
LL dp[maxn];

int main()
{
    //freopen(".in", "r", stdin);
    //freopen(".out", "w", stdout);
    n = gi();
    dp[0] = 1;
    for (int i = 1; i <= n; i+=1)
    {
        for (int j = i; j <= n; j+=1)
        {
            (dp[j] += dp[j - i]) %= (1ll * 2147483648);
        }
    }
    printf("%lld\n", (dp[n] - 1) % (1ll * 2147483648));
    return 0;
}

原文地址:https://www.cnblogs.com/xsl19/p/12303844.html

时间: 2024-10-01 07:05:00

题解【AcWing279】自然数拆分的相关文章

tyvj1172 自然数拆分Lunatic版

背景 话说小小鱼看了P1171(自然数拆分)之后感觉异常不爽,于是异常邪恶地将题目加强. 描述 输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复. 输入格式 输入只有一个整数n,表示待拆分的自然数n. 0<n<=4000PS:0也算自然数,所以这里应该写正整数比较好但是为了尊重原作者的版权(这有版权吗- -),没有改掉.本来n是要到5000的,但是开到5000的话我的程序就Memory Limit Exceeded了.. 输出格式 输出一个数,即所有方案数因为这个数可能

TYVJ1172 自然数拆分Lunatic版 - 背包DP[完全背包]

TYVJ1172 自然数拆分Lunatic版 传送门 思路: 类比TYVJ1096 数字组合 , 本题的数字可以重复使用,所以是一个完全背包模型.\(f[i,j]\)表示当前选到第\(i\)类数字凑成的数字为\(j\)的方案数. Tips: 1.模数为\(2^64\),需要用\(unsigned~long~long\)存储,所以\(f\)数组也要用\(unsigned~long~long\)存储. 2.因为是自然数拆分,所以最终答案减去凑成0的方案数. AC Code: #include<cst

#5:你的背包——6

自然数拆分,完全背包 1 #include <cstdio> 2 #define ll long long 3 #define mod 2147483648 4 #define rep(i, a, b) for (int i = a; i <= b; i++) 5 6 int n; 7 ll f[4005]; 8 9 int main() { 10 scanf("%d", &n); 11 f[0] = 1; 12 rep(i, 1, n) 13 rep(j,

#2019122600027 递归五题

目录 1 全排列 2 01背包 3 自然数拆分 4 页码统计 5 汉诺塔 1 全排列 生成从\(1\)到\(n\)的全排列 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; int a[25]; bool vis[25]; int n; int ans=0; void

BestCoder Round #41

闲来无事打打BC,想必也是极好的,先来个flag:我要刷完所有的BC!! 题A hdu 5228 题意:给你五张牌,问你能够换最少的牌数实现同花顺. 题解:暴力乱搞,才五张牌,枚举所有组成同花顺的可能,然后匹配看还要补多少张即可. 1 /*zhen hao*/ 2 #include <bits/stdc++.h> 3 using namespace std; 4 5 #define lson l, m, rt*2 6 #define rson m + 1, r, rt*2+1 7 #defin

HDU 5665

Lucky Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 138    Accepted Submission(s): 96 Problem Description Chaos August likes to study the lucky numbers. For a set of numbers S,we set the minim

排列和组合

排列和组合在我们高中的时候是最熟悉不过的数学词了,接下来找找这方面的题目供大家思考 (1)爬楼梯 一个楼梯有50个台阶,每一步可以走一个台阶,也可以走两个台阶,请问走完这个楼梯共有多少种方法? (2)铺砖头 有一个长度为n,宽度为2的地面,有若干块长为2,宽为1的地砖,请问用此地砖铺完这个地面共有多少种方法? (3)自然数拆分 给定一个自然数n,将其拆分为若干个自然数字之和,请问有多少种方法? (4)1分2分和5分多少种组合一角的方法 (5)放苹果

SGU - 282

SGU - 282 题意: 本质不同的集合:不存在两个方案重新编号之后对应的边集相同(对于所有x,y,,(x,y)边颜色都相同). (1≤ N≤ 53, 1≤ M≤ 1000) 对P取模 本质不同,想到置换 置换在哪里? 就是重新编号 本质是一个n!大小的置换群 不能枚举每一个置换了,考虑对相同的置换一起处理 置换之后也要找环,所以直接枚举环的情况,处理对应这种环的组合的置换的出现次数,再处理环的组合的不动点 自然数拆分出环 环长为li,有k个,对应置换个数: $\frac{n!}{(l1!*l

[心得]暑假7-27

最近rp=0 上午考试靠炸了,中午迟归被抓了 达哥出的题目,三道“随 单 题”,一点也不“随” “单” 考试时心态..炸道平复(死了) T1想了1个小时,码了一个错误的dp 完了攻T2 T2看似还可做,t=0时来一手换根,t=1时高斯消元 期望得分60 ,实得30,原因:SUM未清空,还有就是清空方程数组时用了N2归零(没判t即清空,导致t=0,1e5数据直接卡死) 本来这场考试我是不敢看T3的,留了30min打算写暴力 然而,发现T3貌似是最近卡特兰数刷过的类型 把type0,1码了一下,期望