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

 

#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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值