为了字节跳动的面试,复习一波算法
题目描述:输入一个n,输出n的所有组成方案,例如:
n=4,有
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
5种方案。
看到网上的很多答案使用母函数之类的。其实这个问题可以用背包的思想解决。
可以理解为有n个物品,第i个物品的容量和价值都为i,而且每个物品可以取任意次。求最后的方案数
众所周知,完全背包的转移方程是F[v]=max{F[v],F[v-C[i]]+W[i]}
计数的话,只需要改成F[v]=sum{F[v],F[v-C[i]]},即F[v]+=F[v-C[i]]
初始化F[0]=1
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int dp[maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
dp[j]+=dp[j-i];
printf("%d\n",dp[n]);
}
return 0;
}