给定一个自然数 N,要求把 N 拆分成若干个正整数相加的形式,参与加法运算的数可以重复。
注意:
- 拆分方案不考虑顺序;
- 至少拆分成 2 个数的和。
求拆分的方案数 mod2147483648 的结果。
输入格式
一个自然数 N。
输出格式
输入一个整数,表示结果。
数据范围
1≤N≤4000
输入样例:
7
输出样例:
14
2147483648是2的31次方所以答案会暴int所以用unsigned来存储。 最大值为2的32次方-1
集合:所有从前i个物品中选择,且总体积恰好是j的方案数的集合
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4010;
int n;
unsigned f[N];
int res;
int main(){
cin>>n;//把n看成背包的容量
f[0]=1;//初始化 最开始的时候一个数都没
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++){
f[j]=f[j]+f[j-i];//多的溢出就行了,所以不需要多余的取模
}
}
cout<<(f[n]-1)%2147483648u<<endl;
return 0;
}
动态规划解决数的拆分方案数问题

这篇博客介绍了如何使用动态规划方法解决给定一个自然数N,将其拆分成至少两个正整数之和的方案数问题。程序代码以C++实现,通过累加前缀和的方式避免了整数溢出,并给出了样例输入和输出。重点在于动态规划状态转移方程的建立和优化。
1863

被折叠的 条评论
为什么被折叠?



