AcWing 279. 自然数拆分
原题链接
简单
作者:
梨小畅
,
2021-04-26 21:17:33
,
所有人可见
,
阅读 476
考察点
完全背包
注意点
(1)因为题目要求至少拆分为2件数的和
所以共有 n-1 种物品,每一种物品的数目是无限的。
(2)由于方案数可能很大所以我们使用 long long,同时模mod
动态转移方程的构造
f[i][j]:从前i个物品里取,能得到和为j的,方案数。
第i种不取,f[i][j]+=f[i-1][j]
第i种取得话,f[i][j]+=f[i-1][j-ki]
(k为第i种物品取的个数)
可变为 f[i][j]+=f[i][j-i]
综上 :f[i][j]=f[i-1][j]+f[i][j-i] (j>=i)
再把二维转化为一维即可。
Code
#include <iostream>
#define mod 2147483648
using namespace std;
typedef long long ll;
const int N=4010;
ll f[N]; // f[i][j] 从前i个里面 能取出和为j 的方案数
int n;
int main(){ // 1~n-1 完全背包
cin>>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])%mod;
cout<<f[n];
return 0;
}