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