完全背包的变形
作者:
巷港
,
2022-03-25 12:31:07
,
所有人可见
,
阅读 183
整数划分
一定注意,**dp问题状态表示的定义至关重要**,后面所有的步骤都要依靠定义的实际意义来想
感觉要是不对空间要求太高,二维表示清晰易懂,思路很正!
#include <iostream>
#include <cstdio>
#include <algorithm>
#define Mod 1000000007
using namespace std;
const int N = 1010;
int f[N][N]; //表示从前i和数中选,凑出和恰好为j的方案数
int n;
int main()
{
scanf("%d",&n);
for (int i=0;i<=n;i++) f[i][0]=1; //从前i个物品中选,凑出和为0的方案数是1,即全不选
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
f[i][j]=f[i-1][j]%Mod; //不选当前这个数
if (j-i>=0) f[i][j]=(f[i-1][j]+f[i][j-i])%Mod; //选当前这个数
}
}
printf("%d\n",f[n][n]); //答案就是从前n个数中选,凑出和恰好为n的方案的个数
return 0;
}