动态规划,判断一个数列的若干项之和是否等于某一个给定的数

 

#include
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

 

你可能感兴趣的:(算法编程,dp)