1303:鸣人的影分身
数据不大,深搜也能过得去。
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int ans,k; 5 void dfs(int b,int s,int d){ 6 if(d==k){ 7 if(!b)ans++; 8 return; 9 } 10 for(int i=s;i<=b;i++){ 11 dfs(b-i,i,d+1); 12 } 13 } 14 int main(){ 15 int n,m; 16 cin>>n; 17 while(n--){ 18 cin>>m>>k; 19 dfs(m,0,0); 20 cout<<ans<<endl; 21 ans=0; 22 } 23 return 0; 24 }
dp解法(相关解释在代码里有进行说明)
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=12; 5 int f[N][N][N]; 6 7 int main(){ 8 int t,m,n; 9 cin>>t; 10 while(t--){ 11 cin>>m>>n; 12 //初始化 13 memset(f,0,sizeof(f)); 14 for(int i=0;i<=m;i++)f[1][i][i]=1; 15 //f[i][j][k]表示第i个人分配j查克拉,前i个人共分配k查克拉 16 for(int i=2;i<=n;i++){ 17 for(int j=0;j<=m;j++){ 18 for(int k=j;k<=m;k++){ 19 for(int l=j;l>=0;l--){//第i-1个人分配多少查克拉 20 f[i][j][k]+=f[i-1][l][k-j]; 21 } 22 } 23 } 24 } 25 int ans=0; 26 for(int i=m/n;i<=m;i++) 27 ans+=f[n][i][m]; 28 cout<<ans<<endl; 29 } 30 return 0; 31 }