(算法初步学习)蛮力法解决生成子集问题

关于蛮力法求生成子集问题

对于算法分析中的问题我已经不想对自己说什么了,到了大三了,竟然还是小白。对生成子集问题我研究了一下午,最后终于想通了。
思路:   1.利用<math.h> 头文件中的pow(x,y)函数来求得2的n次方,作为外循环。2.然后写一个将10进制数转换为2进制数的函数(当然,C中有专门的转换进制的函数在<stdlib.h>中,但是,他转换下来  5不是0101而是101,这就导致需要分开判断,所以不用itoa函数)。
如下:
conversation(int n,int b[MAX])
{
      int I=0;
     for(I;i<MAX;i++)
    {
          b[I]=n%2;
          n=n/2;
          if(n==0)
             break;
    }

3.利用以上函数转换为2进制后,再回到循环体中,利用循环来 输出每次的子集。
完整代码如下:
#include<iostream>
#include<stdlib.h>
#include<String>
using namespace std;
#define MAXSIZE 10
void conversion(int n,int b[])
{
    int i=0;
 for(i;i<MAXSIZE;i++)
 {
  b[i]=n%2;
  n=n/2;
  if(n==0)
   break;
 }
}
void main()
{
 int n;
 cout<<"请输入是几个数的生成子集:\n";
 cin>>n;
 if(n<=MAXSIZE)
 {
   int b[MAXSIZE];
   bool flag = false;
   for(int i=0;i<pow(2,n);i++)
   {
  conversion(i,b);
  for(int j=0;j<MAXSIZE;j++)
  {
   if(b[j]==1)
    {
     cout<<j+1;
     flag = true;
        }
  }
  if(!flag)
   cout<<"空";
  cout<<endl;
   }
 }
 else
  cout<<"数太大了\n";
}
做完这个觉得更应该拿出时间来好好学习算法,这么简单的都设计不出来,未来怎么会成功!!!
加油!!!!

conversation(int n,int b[MAX])
{
      int I=0;
     for(I;i<MAX;i++)
    {
          b[I]=n%2;
          n=n/2;
          if(n==0)
             break;
    }
}
3.利用以上函数转换为2进制后,再回到循环体中,利用循环来 输出每次的子集。
完整代码如下:
#include<iostream>
#include<stdlib.h>
#include<String>
using namespace std;
#define MAXSIZE 10
void conversion(int n,int b[])
{
    int i=0;
 for(i;i<MAXSIZE;i++)
 {
  b[i]=n%2;
  n=n/2;
  if(n==0)
   break;
 }
}
void main()
{
 int n;
 cout<<"请输入是几个数的生成子集:\n";
 cin>>n;
 if(n<=MAXSIZE)
 {
   int b[MAXSIZE];
   bool flag = false;
   for(int i=0;i<pow(2,n);i++)
   {
  conversion(i,b);
  for(int j=0;j<MAXSIZE;j++)
  {
   if(b[j]==1)
    {
     cout<<j+1;
     flag = true;
        }
  }
  if(!flag)
   cout<<"空";
  cout<<endl;
   }
 }
 else
  cout<<"数太大了\n";
}

时间: 2024-11-14 20:00:16

(算法初步学习)蛮力法解决生成子集问题的相关文章

python动态演示蛮力法解决凸包问题

最近开了算法课,但是我的算法着实不咋地,一直搞web和逆向,就没怎么编程.记录一下0.0 算法倒是不难实现,但是这个动态演示很烦,从纯粹的可视化小白,强行写完了,写完发现非常简单,只是自己不知道的函数太多了,哭了.... 蛮力法就不用解释了,通俗的说就是把所有可能试一遍. 凸包问题,就是将n个点中某几个点围成一个多边形,除了这n个点,其余的点都在这个多边形内. 核心算法其实就是一个行列式演变而来,后悔没学好线代..... 参考:https://blog.csdn.net/u011001084/a

算法笔记03--归纳法之生成排列

生成排列 生成排列即对n个数的全排列,显然时间复杂度是n指数级的O(n^k) 假定可以生成n-1个数的所有排列,那么就可以扩展生成1,2,.....,n的排列. 例如1的生成排列即1 1,2的生成排列即1,2和2,1 1,2,3的生成排列在1,2的生成排列基础上可以这样得到: 1在第1位,2,3的生成排列 2在第1位,1,3的生成排列 3在第1位,2,3的生成排列 那么推广到1,2,...,n的生成排列即: 1在第1位,2,...,n的生成排列 2在第2位,1,3,...n的生成排列 ....

算法——蛮力法之最近对问题和凸包问题

上次的博客写到一半宿舍停电了....然而今天想起来补充完的时候发现博客园并没有自动保存哦,微笑. 首先来看最近对问题,最近对问题描述的就是在包含n个端的集合中找到距离最近的两个点,当然问题也可以定义在多维空间中,但是这里只是跟随书上的思路实现了二维情况下的最近对问题.假设所有讨论的点是以标准的笛卡尔坐标形式(x,y)给出的,那么在两个点Pi=(Xi,Yi)和Pj=(Xj,Yj)之间的距离是标准的欧几里得距离: d(Pi,Pj)=sqrt( (X1-X2)2+(Y1-Y2)2 ) 蛮力法的思路就是

蛮力法-最近对和凸包问题

3.3.1 最近对问题 问题描述:要求找出一个包含n个点的集合中距离最近的两个点.原本思想是我们应该去比较两点之间的欧几里得距离,而实际上,我们可以去比较它们的平方,这样,我们就可以避免对平方根的近似求解. 代码实现: /** * 蛮力法解决最近对问题 * @author xiaofeig * @since 2015.9.16 * @param points 对象点集 * @return 返回包含最小对的下标 * */ public static int[] bruteForceClosestP

算法学习 - HashTable开放地址法解决哈希冲突

开放地址法解决哈希冲突 线性开放地址法 线性开放地址法就是在hash之后,当发现在位置上已经存在了一个变量之后,放到它下一个位置,假如下一个位置也冲突,则继续向下,依次类推,直到找到没有变量的位置,放进去. 平方开放地址法 平方地址法就是在hash之后,当正确位置上存在冲突,不放到挨着的下一个位置,而是放到第2^0位置,假如继续冲突放到2^1的位置,依次2^3... 直到遇到不冲突的位置放进去. 双散列开放地址法 双散列同上,不过不是放到2^的位置,而是放到key - hash(key, tab

算法学习 - Hash Table操作,分离链接法解决哈希冲突

分离链接法 hash table是映射机制的,最大的优点就是它的操作是O(1)级别的.但是会出现哈希冲突,这就需要几种办法来解决.这里先说一种:分离链接法. 就是当插入的位置已经存在一个值之后,那么在这个值之后插入,就可以了,也叫拉链法.(但是其实会降低查找速度,变成O(n)级别) 下面是代码: // // main.cpp // HashTable_SeparateChaining // // Created by Alps on 14-8-5. // Copyright (c) 2014年

关于算法--蛮力法篇--选择排序

近日开始学习算法,所看课本为清华大学出版社的<算法设计与分析基础>,对简单的数据结构进行了复习,已经学习了算法效率分析基础. 本篇开始对所学算法的思想进行实际JS编码,看学习的进度,每日写一篇学到的算法,以上为背景. 蛮力法是一种直接解决问题的方法,常常基于问题的描述和所涉及的概念定义:所谓的“力”,指的是计算机的计算能力. 优点是①可解决广阔的领域各种问题:②可以产生一些合理的算法:③实例不多时,可用一种能接受的速度求解:④可解决一些小规模问题实例:⑤可作为研究或教学目的,作为其他算法的准绳

算法——蛮力法之选择排序和冒泡排序c++实现

这次实现的是蛮力法中的两个例子,选择排序法和冒泡排序法,使用的编译环境是vs2013,下面对这两个算法做一个简单介绍,然后是两个算法的c++实现代码. 选择排序法比较的范围是整个列表,每次扫描结束找出最小的一个元素一次放在前面的位置:而冒泡排序法每次是将相邻两个元素进行比较,将较大的元素放在后面,这样一次扫描结束后就将当前最大的那个元素放在了列表的后面. 两个排序方法的算法如下: 选择排序法 SelectionSort(A[0....n-1]) //输入:一个可排序数组A[0....n-1],

关于算法--蛮力法--字符与字符串匹配

一.顺序查找 1.步骤:简单的将给定列表中的连续元素与给定的查找键作比较,直到遇到一个匹配的元素或遇到匹配元素前就遍历了整个列表 2.JavaScript代码实现 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>SelectionFind</title> 6 </head>