[Acwing藍橋杯DP] 1050. 鳴人的影分身
阿新 • • 發佈:2022-03-31
題目大意:t組資料,每組資料有個正整數m分成n個非負數的方案
方案中不考慮順序,例(2,2,3) 和 (2,3,2) 被視為同一種方案
資料範圍:0<= t <=20
1<=n,m<=10
分析:這個題資料範圍比較小,雖然可以暴力過,但是容易爆,也可以打表
正確做法是DP,時間複雜度是O(n^2);
ps:這個題中不考慮順序,如果考慮順序的化就是插板
閆氏DP分析法:
集合:f [ i ][ j ] :表示總和為 i ,方案數為 j 。
屬性: 方案數
狀態轉移:
方式劃分 (1) 整個序列的最小值為 0
(2)整個序列的最小值大於0
轉移:f [ i ][ j ]=f [ i ][ j -1 ]+f [ i - j ( i>=j ) ][ j ]
初始化:f [ 0 ][ 0 ] = 1;// 表示沒有數的時候 總和為0 方案成立
程式碼:
#include <bits/stdc++.h>
using namespace std;
const int N=15;
int f[N][N];
int n,m;
int main()
{
int T;
cin>>T;
while(T--)
{
memset(f, 0,sizeof f);
cin>>m>>n;
f[0][0]=1;//初始化
for(int i=0;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
f[i][j]=f[i][j-1];
if(i>=j)f[i][j]+=f[i-j][j];
}
}
cout<<f[m][n]<<endl;
}
return 0;
}
end!!!