第二题: 给定一个正整数s, 判断一个数组arr中,是否有一组数字加起来等于s。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int a[100];
int subset[100][100];
int rec_subset(int i,int  s)   // 递归
{
	if (s == 0)
		return 1;
	else if (i == 0)
		return a[0] == s;
	else if (a[i] > s)
		return rec_subset(i - 1, s);
	else
	{
		int A = rec_subset(i - 1, s - a[i]);
		int B = rec_subset(i - 1, s);
		return A || B;
	}
}
int dp_subset(int lon, int S)   // 动态规划
{
	for (int i = 0; i < lon; i++) // 递归出口
	{
		subset[i][0] = 1;
	}
	for (int i = 0; i <= S; i++)  // 递归出口
	{
		subset[0][i] = 0;
	}subset[0][a[0]] = 1;      
	
	for (int i = 1; i < lon; i++)
	{
		for (int j = 1; j <= S; j++)
		{
			if (a[i] > j)    // 递归出口
				subset[i][j] = subset[i - 1][j];
			else
			{
				int A = subset[i - 1][j - a[i]];
				int B = subset[i - 1][j];
				subset[i][j] = A || B;
			}
		}
	}
	return  subset[lon - 1][S];
}
int main(void)
{
	int lon, S;
	while (scanf("%d%d", &lon, &S) != EOF)
	{
		for (int i = 0; i < lon; i++)
		{
			scanf("%d", &a[i]);
		}
		printf("%d\n", rec_subset(lon - 1, S));
		printf("%d\n", dp_subset(lon, S));
	}
	
	system("pause");
	return 0;
}
/*测试数据
6 9
3 34 4 12 5 2
6 13
3 34 4 12 5 2
*/
原文:https://www.cnblogs.com/asdfknjhu/p/12422469.html