状态:dp[i][j]表示和为i最大数小于等于j的方案数
初始状态:dp[0][0]=1
状态转移:dp[i][j]=dp[i-j][j-1]+dp[i][j-1],i>=j
第二维可以用滚动数组消掉
最后减去和为n最大值也为n的情况,因为这种不满足条件
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) ll dp[555]; int main(){ ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; dp[0]=1; for(int i=1;i<=n;i++){ for(int j=n;j>=i;j--)dp[j]+=dp[j-i]; } cout<<dp[n]-1<<endl; return 0; }