4117:简单的整数划分问题——01背包变形
思路:dp[i][j]表示从1~j中选取数字能组成 i 的种类数
初始化:dp[1][i]=1;//1+...+1=i
dp[i][1]=1;//仅选1=1
状态转移:1)i=j,则dp[i][j]=dp[i][j-1]+1;//仅选取j组成和=i,一种情况
2)j>i,则第i+1,i+2,...,j 这些数没有用
3)j<i:使用j:从1~j中选取和为i-j,再加上j则和为i;dp[i-j][j]种
不使用j,dp[i][j-1]
AC代码:
#include<iostream>
#include<string.h>
using namespace std;
int dp[51][51];
int n,k;
int main()
{
int i,j;
while(cin>>n)
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for (i=1;i<=n;i++)//和
for (j=1;