莫欺少年穷,修仙之旅在这开始—>算法基础课题解
完全背包问题求方案数
推导过程:
$因为\ \ f[i][j]=f[i-1][j]+f[i-1][j-i]+f[i-1][j-2i]+…+f[i-1][j-ki]$
$\ \ \ \ \ \ \ \ f[i][j-i]=\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ f[i-1][j-i]+f[i-1][j-2i]+…+f[i-1][j-ki]$
$所以\ \ f[i][j]=f[i-1][j]+f[i][j-i]$
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1010, mod = 1e9 + 7;
int n;
int f[N]; //只从前 i 个物品中选,体积恰好是 j 的方案数
int main()
{
cin>>n;
f[0]=1; //什么都不选也是一种方案
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++) //保证了 f[j-i] 是 f[i][j-i]
f[j]=(f[j]+f[j-i])%mod;
cout<<f[n]<<endl;
return 0;
}
e