900. 整数划分
f[i][j]
:从1~i
中选,总体积恰好是j
的方案数
思考一下:这为什么能保证顺序。即满足题中的
一个正整数n可以表示成若干个正整数之和,形如:,其中。
这个条件
(a * b)%c = (a%c) * (b%c)
(a + b)%c = a%c + b%c
作者:一个月刷完剑指Offer
链接:https://www.acwing.com/solution/acwing/content/2954/
初始化空集
f[0] = 1
的原因:
从状态转移方程f[j] = (f[j] + f[j - i]) % mod;
可以看到
只有可能f[j - i]
是f[0]
,而这是其实就是表示我用一个i
完成了划分,所以也是一种方案
#include<iostream>
using namespace std;
const int N=1010;
int mod=1e9+7;
int f[N];
int main(){
int n,m;
scanf("%d",&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;
}
另一种做法: