TYVJ1172(dp)
程序员文章站
2022-05-22 11:35:21
...
描述
给定一个自然数N,要求把N拆分成若干个正整数相加的形式,参与加法运算的数可以重复。求拆分的方案数 mod 2147483648的结果。1≤N≤4000。输入格式
一个整数n。输出格式
输出一个数,即所有方案数
因为这个数可能非常大,所以你只要输出这个数 mod 2147483648 的余数即可。样例输入
7
样例输出
14
样例解释
输入7,则7拆分的结果是
7=1+6
7=1+1+5
7=1+1+1+4
7=1+1+1+1+3
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
7=1+1+1+2+2
7=1+1+2+3
7=1+2+4
7=1+2+2+2
7=1+3+3
7=2+5
7=2+2+3
7=3+4一共有14种情况,所以输出14 mod 2147483648,即14
完全背包。
#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define P pair<int,int>
#define Pil pair<int,ll>
#define Pli pair<ll,int>
#define Pll pair<ll,ll>
#define pb push_back
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define fr first
#define se second
#define ll long long
const ll p = 2147483648;
int read()
{
int sum = 0;char c = getchar();bool flag = true;
while(c < '0' || c > '9') {if(c == '-') flag = false;c = getchar();}
while(c >= '0' && c <= '9') sum = sum * 10 + c - 48,c = getchar();
if(flag) return sum;
else return -sum;
}
unsigned int dp[4010];
int main()
{
int n = read();
dp[0] = 1;
rep(i,1,n-1)
rep(j,i,n)
dp[j] = dp[j-i]+dp[j];
printf("%d\n",dp[n]%p);
return 0;
}
推荐阅读
-
关于实现代码语法标亮 dp.SyntaxHighlighter_javascript技巧
-
HDU 1400 插头DP,状压DP
-
bzoj1003: [ZJOI2006]物流运输(最短路+DP)
-
BZOJ4008: [HNOI2015]亚瑟王(期望dp)
-
dp总结
-
「雅礼集训 2017 Day2」水箱 并查集+树形DP
-
Codeforces Round #275 (Div. 1)D(树形DP)_html/css_WEB-ITnose
-
树形DP图画入门题解2 (HDU2196)
-
蓝桥杯--砝码称重(dp)
-
Codeforces Round #157 (Div. 1) C. Little Elephant and LCM (数学、dp)