编号 | 球是否相同 | 盒子是否相同 | 是否可以空盒 |
1 | 相同 | 相同 | 是 |
2 | 相同 | 相同 | 否 |
3 | 不相同 | 相同 | 否 |
4 | 不相同 | 相同 | 是 |
5 | 相同 | 不相同 | 否 |
6 | 相同 | 不相同 | 是 |
7 | 不相同 | 不相同 | 否 |
8 | 不相同 | 不相同 | 是 |
1.球相同,盒相同,有空盒
用f[i][j]记录i个球放到j个盒子的情况,首先可以对f[i][j]进行初始化的操作:
i=0的时候,0个球放到j个盒子里的情况始终为1;
i=1的时候,1个球放到j个盒子里的情况始终为1;
j=1的时候,i个球放到1个盒子里的情况始终为1;
其次对于之后的f[i][j]的情况:
i<j的时候:i个球放到j个盒子的情况与i个球放到j-1个盒子的情况相同
此时:f[i][j]=f[i][j-1];
i>=j的时候:可以由当前第j个盒子为空盒子,j个盒子全放然后处理i-j个球放j个盒子的情况得到;
此时:f[i][j]=f[i][j-1]+f[i-j][j];
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
const int N=20;
int f[N][N];
void pre(){
memset(f,0,sizeof(f));
for(int i=0;i<=15;i++){
for(int j=0;j<=15;j++){
if(i=