用c语言解决集合中关于子集的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c语言解决集合中关于子集的问题相关的知识,希望对你有一定的参考价值。

集合运算问题
设集合A=al , a2,a3… ,am ,集合B=bl , b2,… ,bn,则求下列运算
判断B是A 的子集
用c语言编写,用至少一个子函数来实现。

#include <stdio.h>
int No1(int a[10],int b[3]);
int main()

int a[10]=1,2,3,4,5,6,7,8,9,0;
int b[3]=4,5,6;
No1(a,b);

int No1(int a[10],int b[3])

int i;
int j;
int k=0;
for(i=0;i<10;i++)

for(j=0;j<3;j++)

if(b[j]==a[i])

k++;



if(k==3)

printf("b是a的子函数");


大概就是这个样子,你试试看把
参考技术A 问一个问题,集合内的数据类型,我好建立数组。追问

整型数组就行,

追答

再麻烦一件事情,是要动态数组还是确定数量的。就本题,m和n是确定的,还是每次要人输入的。最大值有限制吗?我的想法是定义m和n是1000,也就是最多1000个数字在里面。然后由于检查运行效果一般是人输入,所以1000应该够用了。接下来记录输入的数量,然后判断,这样可以吗?

傻瓜方法求集合的全部子集问题(java版)

    给定随意长度的一个集合。用一个数组表示,如{"a", "b","c"},求它的全部子集。结果是{ {a}, {b}, {c}, {a,b}, {a,c}, {b,c}, {a,b,c}}和一个空集。

    以下讲的就是怎样用一个原始的傻瓜方法(非算法)求它的全部子集。

    首先我们知道是它的子集个数是2^length,假设长度是3,那子集就共同拥有2的3次方=8个,包含空集。

    求子集,我的做法是对不论什么一项做推断,有或者无,用1和0来相应表示。

    那么像这样的长度为3的,用二进制来表示就是000、001、010……

    事实上就是从0-2^3,用2进制表示出来就是所以的子集了。然后把0相应的子项给拿掉。譬如010相应的就是b,011相应的就是bc。

仅仅须要从0到2^3-1做一个循环。然后把0-7之间的数用二进制表示出来,再与原集合进行对照。

把0相应位置的字符去掉,这样就得到了全部子集。

   原理非常easy,以下是代码

package huisu;

/**
 * Created by wolf on 2016/3/22.
 */
public class GetSet {
    private String[] origin = {"a", "b", "c"};

    private String[] targetArray;

    public static void main(String[] args) {
          new GetSet().doJob();
    }
    
    private void doJob() {
        //获取将要分解的字符串假设转为2进制最大是几
        //如字符串是3位。就是2^3。

从[0 0 0]到[1 1 1] int maxLength = (int) Math.pow(2, origin.length); targetArray = new String[maxLength]; for (int i = 0; i < targetArray.length; i++) { //十进制转2进制 targetArray[i] = Integer.toBinaryString(i); } buling(); print(); } /** * 给空位补0,凑齐位数 */ private void buling() { for (int i = 0; i < targetArray.length; i++) { //位数是完整的,不须要补0 if (targetArray[i].length() == origin.length) { continue; } String temp = ""; //0,1,10,11,111 for (int j = 0; j < origin.length - targetArray[i].length(); j++) { temp += "0"; } targetArray[i] = temp + targetArray[i]; } } private void print(){ for (int i = 0; i < targetArray.length; i++) { String s = targetArray[i];//如000,001,010 for (int j = 0; j < s.length(); j++) { char item = s.charAt(j); if (item == '1') { System.out.print(origin[j]); } } System.out.println(); } } }

    在第23行是将10进制的0-7转成二进制,转之后例如以下图

技术分享

    这里就有个问题,那就是位数并不满。像0、10之类的,将来和原始数组做相应推断的时候有点小麻烦,所以我做了个处理,把位数补齐。保持和原始数组位数一样。

    调用了buling(原谅我想不起来用什么英语来表示补零)方法。把位数不足的前面全补上0.然后就变成了000,001,010……这样就能够非常方便的去推断了,仅仅打印1所在的位数即可了。參考print方法。

    总结:这样的做法比較简单易懂。也能适应随意长度的求子集问题。

依据这样的做法,还能解决另外一个问题——01背包问题(有编号分别为a,b,c,d,e的五件物品。它们的重量各自是2,2,6,5,4,它们的价值各自是6,3,5,4,6。如今给你个承重为10的背包。怎样让背包里装入的物品具有最大的价值总和?)相信非常easy能看出来,上面的方法求出来了全部子集,那么对于01背包问题。就是依据全部的子集。先砍掉全部超重的子集。然后去计算剩余的子集的价值,找到最大的就OK了。

    

    



以上是关于用c语言解决集合中关于子集的问题的主要内容,如果未能解决你的问题,请参考以下文章

数据结构C语言描述中关于二叉树

c中关于转义字符!!

Jsoncpp使用具体解释以及链接问题解决

C++中关于static

c++中关于char与cin的疑惑

JSON 简介