#include<cstdio>
using namespace std;
#define n 6
int arr[6] = { 3, 34, 4, 12, 5, 2 };
int subset[6][100];
void dp(int C) { //C是要凑的数
for (int i = 0; i < n; i++)
subset[i][0] = 1; //不管对于第i个数,只要还需拼凑的数是0,则成立
subset[0][arr[0]] = 1;
for (int i = 1; i < n; i++) {
for (int j = 1; j <= C; j++) { //模拟
if (arr[i] > j) { //这个数太大,已经超过了j,则选另一个数
subset[i][j] = subset[i - 1][j];
} else if (arr[i] == j) {
subset[i][j] = 1; //成立
} else { //这个数不是太大,有两种选择,要么选,要么不选
int a = subset[i - 1][j]; //不选,j不变
int b = subset[i - 1][j - arr[i]]; //选
if (a || b) { //如果状态a和状态b有一个成立,那么本状态成立
subset[i][j] = 1;
}
}
}
}
printf("---------凑%d-------------\n", C);
for (int i = 0; i < n; i++) {
for (int j = 0; j <= C; j++) {
printf("%4d", subset[i][j]);
}
printf("\n");
}
}
int main() {
printf("要凑的数每增加1,则我的输出多一列\n");
dp(9); //假如要凑9
dp(10); //假如要凑10
dp(11); //假如要凑11
dp(12); //假如要凑12
dp(13); //假如要凑13
return 0;
}
输出:
要凑的数每增加1,则我的输出多一列
---------凑9-------------
1 0 0 1 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0
1 0 0 1 1 0 0 1 0 0
1 0 0 1 1 0 0 1 0 0
1 0 0 1 1 1 0 1 1 1
1 0 1 1 1 1 1 1 1 1
---------凑10-------------
1 0 0 1 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0 0
1 0 0 1 1 0 0 1 0 0 0
1 0 0 1 1 0 0 1 0 0 0
1 0 0 1 1 1 0 1 1 1 0
1 0 1 1 1 1 1 1 1 1 1
---------凑11-------------
1 0 0 1 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0 0 0
1 0 0 1 1 0 0 1 0 0 0 0
1 0 0 1 1 0 0 1 0 0 0 0
1 0 0 1 1 1 0 1 1 1 0 0
1 0 1 1 1 1 1 1 1 1 1 1
---------凑12-------------
1 0 0 1 0 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0 0 0 0
1 0 0 1 1 0 0 1 0 0 0 0 0
1 0 0 1 1 0 0 1 0 0 0 0 1
1 0 0 1 1 1 0 1 1 1 0 0 1
1 0 1 1 1 1 1 1 1 1 1 1 1
---------凑13-------------
1 0 0 1 0 0 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0 0 0 0 0
1 0 0 1 1 0 0 1 0 0 0 0 0 0
1 0 0 1 1 0 0 1 0 0 0 0 1 0
1 0 0 1 1 1 0 1 1 1 0 0 1 0
1 0 1 1 1 1 1 1 1 1 1 1 1 0