vijos 1117 數的劃分(整數拆分)
阿新 • • 發佈:2019-01-26
將整數n分成k份,且每份不能為空,任意兩份不能相同(不考慮順序)。
例如:n=7,k=3,下面三種分法被認為是相同的。
1,1,5; 1,5,1; 5,1,1;
問有多少種不同的分法。
dp:
剩下的j分i份,最大的那份為k
#include<bits/stdc++.h> using namespace std; int f[10][201][201]; int main(){ int n,ans=0,m; cin>>n>>m; f[0][0][0]=1; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) for(int k=1;k<=j;k++) for(int l=0;l<=k;l++) f[i][j][k]+=f[i-1][j-k][l]; for(int i=1;i<=n;i++) ans+=f[m][n][i]; cout<<ans<<endl; return 0; }
2.
#include<bits/stdc++.h> using namespace std; int g[505][505]; int main(){ int n,k,m; cin>>m>>k; for(int i=0;i<m;i++) g[i][0]=1; for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) if(j>=i) g[i][j]=g[i][j-i]+g[i-1][j]; else g[i][j]=g[i-1][j]; cout<<g[k][m-k]<<endl; return 0; }
3.類似poj 1664 分蘋果分法:
//7分3拆為6分2(最小數為1)和4分3(最小數不為1,每份去掉一個1再分) #include<bits/stdc++.h> using namespace std; int dp[505][505]; int main(){ int n,ans=0,m; cin>>n>>m; dp[1][1]=1; for(int i=2;i<=n;i++) for(int j=1;j<=m;j++) if(i>=j) dp[i][j]=dp[i-1][j-1]+dp[i-j][j]; cout<<dp[n][m]<<endl; return 0; }