首页 > 其他 > 详细

看正月点灯笼老师的笔记 ——动态规划2.2

时间:2020-03-05 20:38:20      阅读:117      评论:0      收藏:0      [点我收藏+]

第二题: 给定一个正整数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
*/

  

看正月点灯笼老师的笔记 ——动态规划2.2

原文:https://www.cnblogs.com/asdfknjhu/p/12422469.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!