C#,子集和问题(Subset Sum Problem)的算法与源代码

1 子集和问题(Subset Sum Problem)

给定一组非负整数和一个值和,确定给定集合中是否存在和等于给定和的子集。

示例:

输入:set[]={3,34,4,12,5,2},sum=9

输出:真

有一个子集(4,5)和9。

输入:设置[]={3,34,4,12,5,2},和=30

输出:False

没有加起来等于30的子集。

推荐做法

子集和问题

试试看!

方法1:递归。

方法:对于递归方法,我们将考虑两种情况。

考虑最后一个元素,现在所需的总和=目标总和–最后一个元素的值,元素数量=总元素–1

保留“最后一个”元素,现在所需的总和=目标总和,元素数=总元素数–1

以下是isSubsetSum()问题的递归公式。

IsubSetSum(集合,n,总和)

=IsubSetSum(集合,n-1,总和)| |

IsubSetSum(集合,n-1,和集合[n-1])

基本情况:

IsubSetSum(set,n,sum)=false,如果sum>0且n==0

IsubSetSum(set,n,sum)=真,如果sum==0

2 源代码

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public static partial class Algorithm_Gallery{public static bool SubsetSum_Problem_Solve(int[] set, int n, int sum){if (sum == 0){return true;}if (n == 0){return false;}if (set[n - 1] > sum){return SubsetSum_Problem_Solve(set, n - 1, sum);}return SubsetSum_Problem_Solve(set, n - 1, sum) || SubsetSum_Problem_Solve(set, n - 1, sum - set[n - 1]);}public static bool SubsetSum_Problem_Solve_2th(int[] set, int n, int sum){bool[,] subset = new bool[sum + 1, n + 1];for (int i = 0; i <= n; i++){subset[0, i] = true;}for (int i = 1; i <= sum; i++){subset[i, 0] = false;}for (int i = 1; i <= sum; i++){for (int j = 1; j <= n; j++){subset[i, j] = subset[i, j - 1];if (i >= set[j - 1]){subset[i, j] = subset[i, j] || subset[i - set[j - 1], j - 1];}}}return subset[sum, n];}public static bool SubsetSum_Problem_Solve_3th(int[] set, int n, int sum){int[,] tab = new int[n + 1, sum + 1];for (int i = 1; i <= n; i++){for (int j = 1; j <= sum; j++){tab[i, j] = -1;}}if (sum == 0){return true;}if (n <= 0){return false;}if (tab[n - 1, sum] != -1){return tab[n - 1, sum] > 0;}if (set[n - 1] > sum){tab[n - 1, sum] = SubsetSum_Problem_Solve_3th(set, n - 1, sum) ? 1 : 0;return tab[n - 1, sum] > 0;}else{if (SubsetSum_Problem_Solve_3th(set, n - 1, sum) || SubsetSum_Problem_Solve_3th(set, n - 1, sum - set[n - 1])){tab[n - 1, sum] = 1;return true;}else{tab[n - 1, sum] = 0;return false;}}}}
}

3 源程序

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public static partial class Algorithm_Gallery
    {
        public static bool SubsetSum_Problem_Solve(int[] set, int n, int sum)
        {
            if (sum == 0)
            {
                return true;
            }
            if (n == 0)
            {
                return false;
            }
            if (set[n - 1] > sum)
            {
                return SubsetSum_Problem_Solve(set, n - 1, sum);
            }
            return SubsetSum_Problem_Solve(set, n - 1, sum) || 
                SubsetSum_Problem_Solve(set, n - 1, sum - set[n - 1]);
        }

        public static bool SubsetSum_Problem_Solve_2th(int[] set, int n, int sum)
        {
            bool[,] subset = new bool[sum + 1, n + 1];

            for (int i = 0; i <= n; i++)
            {
                subset[0, i] = true;
            }
            for (int i = 1; i <= sum; i++)
            {
                subset[i, 0] = false;
            }
            for (int i = 1; i <= sum; i++)
            {
                for (int j = 1; j <= n; j++)
                {
                    subset[i, j] = subset[i, j - 1];
                    if (i >= set[j - 1])
                    {
                        subset[i, j] = subset[i, j] || subset[i - set[j - 1], j - 1];
                    }
                }
            }
            return subset[sum, n];
        }
        public static bool SubsetSum_Problem_Solve_3th(int[] set, int n, int sum)
        {
            int[,] tab = new int[n + 1, sum + 1];
            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= sum; j++)
                {
                    tab[i, j] = -1;
                }
            }
            if (sum == 0)
            {
                return true;
            }
            if (n <= 0)
            {
                return false;
            }
            if (tab[n - 1, sum] != -1)
            {
                return tab[n - 1, sum] > 0;
            }
            if (set[n - 1] > sum)
            {
                tab[n - 1, sum] = SubsetSum_Problem_Solve_3th(set, n - 1, sum) ? 1 : 0;
                return tab[n - 1, sum] > 0;
            }
            else
            {
                if (SubsetSum_Problem_Solve_3th(set, n - 1, sum) || SubsetSum_Problem_Solve_3th(set, n - 1, sum - set[n - 1]))
                {
                    tab[n - 1, sum] = 1;
                    return true;
                }
                else
                {
                    tab[n - 1, sum] = 0;
                    return false;
                }
            }
        }
    }
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于智慧灯杆的智慧城市解决方案(1)

背景概述 智慧城市要求充分运用信息和通信技术手段感测、分析、整合城市运行核心系统的各项关键信息,从而对于包括民生、城市服务、工商业活动在内的各种需求做出智能的响应。在这个过程中,迫切需要一个信息采集、信息路灯作为城市中密度最大、数信息发布的载体。处理、量最…

【RHCSA问答题】第十二章 管理网络

系列文章目录 第一章 红帽企业Linux入门 第二章 访问命令行 第三章 从命令行管理文件&#xff08;上&#xff09; 第三章 从命令行管理文件&#xff08;下&#xff09; 第五章 创建、查看和编辑文本文件&#xff08;上&#xff09; 第五章 创建、查看和编辑文本文件&#xff0…

【快速入门 Vue 框架:从基础到实践】

在现代的 Web 开发中&#xff0c;Vue.js 已经成为了一种非常流行的 JavaScript 框架。它的简洁性和灵活性使得开发者能够快速构建交互性强、高效的用户界面。本文将带领读者从基础开始&#xff0c;逐步掌握 Vue 框架的核心概念&#xff0c;并通过实例演示如何快速上手 Vue 框架…

WPF LinearGradientBrush立体效果

WPF LinearGradientBrush立体效果 渐变方向 1. 默认是左上角到右下角 2.从左到右 <Border Height"35" Width"120"><Border.Background><LinearGradientBrush EndPoint"1,0"><GradientStop Color"Yellow"Offs…

28.基于SpringBoot + Vue实现的前后端分离-在线文档管理系统(项目 + 论文PPT)

项目介绍 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;在线文档管理当然也不能排除在外。在线文档管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&…

Qt插件之输入法插件的构建和使用(一)

文章目录 输入法概述输入法插件实现及调用输入键盘搭建定义样式自定义按钮实现自定义可拖动标签数字符号键盘候选显示控件滑动控件手绘输入控件输入法概述 常见的输入法有三种形式: 1.系统级输入法 2.普通程序输入法 3.程序自带的输入法 系统级输入法就是咱们通常意义上的输入…

【深度学习数学基础】隐变量条件概率建模

P θ ( y ∣ x ) ∫ z P θ ( y ∣ z , x ) p θ ( z ∣ x ) d z P_\theta(\mathbf{y}|\mathbf{x})\int_\mathbf{z}P_\theta(\mathbf{y}|\mathbf{z},\mathbf{x})p_\theta(\mathbf{z}|\mathbf{x})d\mathbf{z} Pθ​(y∣x)∫z​Pθ​(y∣z,x)pθ​(z∣x)dz 上面的公式是一个条件…

select poll epoll的区别

I/O多路复⽤通常通过select、poll、epoll等系统调⽤来实现。 select&#xff1a; select是⼀个最古老的I/O多路复⽤机制&#xff0c;它可以通过轮询的方式监视多个⽂件描述符的可读、可写和错误状态。然而&#xff0c;但是它的效率可能随着监视的⽂件描述符数量的增加⽽降低。…

蓝桥杯2022年第十三届省赛真题-求阶乘

二分法 1.定义left为0&#xff0c;right为Long.MAX_VALUE。之后再进行while循环来进行查找精准。之后在调用方法来计算二分查找的值中有几个5的倍数的个数。如果这个值中5的倍数的个数不等于条件就返回-1 符合条件就返回这个二分查找的数。 import java.util.Scanner;public…

C/C++生态工具链——编译构建工具CMake/CMakeList初探

一&#xff0c;CMake简介 CMake的全称是Cross-platform Make。我第一次参与Linux C开发时使用的工具是Make&#xff0c;而后开始切换到CMake&#xff0c;一开始以为CMake是和C语言有关&#xff0c;原来开头的C表示它可以跨平台。 CMake的使用场景&#xff1a; 跨平台编译运行&…

爬虫练习:获取某招聘网站Python岗位信息

一、相关网站 二、相关代码 import requests from lxml import etree import csv with open(拉钩Python岗位数据.csv, w, newline, encodingutf-8) as csvfile:fieldnames [公司, 规模,岗位,地区,薪资,经验要求]writer csv.DictWriter(csvfile, fieldnamesfieldnames)writer…

springboot262基于spring boot的小型诊疗预约平台的设计与开发

小型诊疗预约平台 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本小型诊疗预约平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理…

【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别

文章目录 0. 前言1. 级联神经网络介绍2. MTCNN介绍2.1 MTCNN提出背景2.2 MTCNN结构 3. MTCNN PyTorch实战3.1 facenet_pytorch库中的MTCNN3.2 识别图像数据3.3 人脸识别3.4 关键点定位 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff…

DenseNet笔记

&#x1f4d2;from ©实现pytorch实现DenseNet&#xff08;CNN经典网络模型详解&#xff09; - 知乎 (zhihu.com) 是什么之 DenseBlock 读图&#xff1a; x0是inputH1的输入是x0 (input)H2的输入是x0和x1 (x1是H1的输出) Summary&#xff1a; 传统卷积网&#xff0c;网…

IDEA管理Git + Gitee 常用操作

文章目录 IDEA管理Git Gitee 常用操作1.Gitee创建代码仓库1.创建仓库1.点击新建仓库2.完成仓库信息填写3.创建成功4.管理菜单可以修改这个项目的设置 2.设置SSH公钥免密登录基本介绍1.找到.ssh目录2.执行指令 ssh-keygen3.将公钥信息添加到码云账户1.点击设置2.ssh公钥3.复制.…

[力扣 Hot100]Day50 二叉树中的最大路径和

题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &…

ETL与抖音数据同步,让数据流动无阻

在当今数字化时代&#xff0c;数据的价值日益凸显&#xff0c;企业需要从各种渠道获取有关用户行为、市场趋势和竞争对手活动的数据。作为一家专注于数据集成和转换的领先平台&#xff0c;ETLCloud为企业提供了强大的数据同步和转换功能。而与此同时&#xff0c;抖音作为一款热…

Java中常见的“类”大全

Java 中有很多常见的类&#xff0c;它们提供了各种功能&#xff0c;从基本数据类型的封装到复杂的数据结构和算法。以下是一些常见的 Java 类&#xff1a; 1.Object 类&#xff1a; 所有类的超类&#xff0c;提供了一些通用的方法&#xff0c;如 toString()、equals()、hashCod…

论文解读:Meta-Baseline: Exploring Simple Meta-Learning for Few-Shot Learning

文章汇总 总体问题 通过对整体分类的训练(文章结构图中ClassifierBaseline)&#xff0c;即在整个标签集上进行分类&#xff0c;它可以得到与许多元学习算法相当甚至更好的嵌入。这两种工作之间的界限尚未得到充分的探索&#xff0c;元学习在少样本学习中的有效性仍然不清楚。…

Visual C++ 2010学习版安装教程

1. 创建项目 点击 “创建新项目”&#xff0c;创建一个项目。 2. 创建 helloworld.c ⽂件 3. 在弹出的编辑框中&#xff0c;选中 “C文件(.cpp)”&#xff0c;将 下方 “源.cpp” 手动改为要新创建的文件名。 如&#xff1a;helloWorld.c 。注意&#xff0c;默认 cpp 后缀名&am…