(23条消息) 算法练习日志1(折半查找+快排+增量穷举)_Rightstar的博客-CSDN博客_有n个集装箱要装上一艘载重量为w的船,其中集装箱

504 阅读1分钟

算法练习日志

一、折半查找(二分查找)

/**
*
*题目描述:
*利用二分查找算法查找数组中某个数
*/
#include <iostream>
using namespace std;
int binSearch(int a[],int low,int high,int num)
{
    int mid;
    if(low<high)  
    {
      mid = (low+high)/2;   //查找区间中间位置
      if(a[mid]==num)
            return mid;
      if(a[mid]>num)
        return binSearch(a,low,mid-1,num);
      else
        return binSearch(a,mid+1,high,num);
    }
    return -1;
}
int main()
{
    int n;
    cout<<"输入数组长度:";
    cin>>n;
    int a[n];
    cout<<"输入数组(已排序):"<<endl;
    for(int i=0;i<n;i++)
        cin>>a[i];
    int num;
    cout<<"输入查找的数字:";
    cin>>num;
    int i =binSearch(a,0,n,num);
    if(i>=0)
        cout<<num<<" 的位置在 a["<<i<<"]"<<endl;
    else
        cout<<"未找到 "<<num<<endl;

    return 0;
}

二、快速排序

/*
*题目描述:
*对数组进行快速排序
*/
#include <iostream>
using namespace std;
void display(int a[],int n)
{
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    cout<<endl;
}
int position(int a[],int s,int e)
{
    int i =s,j =e;
    int temp = a[s];
    while(i!=j)
    {
        while(j>i&&a[j]>=temp)
            j--;//从右向左扫描
        a[i] = a[j];
        while(i<j&&a[i]<=temp)
            i++;
        a[j] = a[i];
    }
    a[i] = temp;
    return i;
}
void quickSort(int a[],int s,int e)
{   if(s<e)
    {
        //至少有两个元素,递归排序
        int i = position(a,s,e);
        quickSort(a,s,i-1);//左子树
        quickSort(a,i+1,e);//右子树


    }

}
int main()
{
    int n;
    cout<<"输入数组长度:";
    cin>>n;
    int a[n];
    cout<<"输入数组(未排序):"<<endl;
    for(int i=0;i<n;i++)
        cin>>a[i];
    quickSort(a,0,n-1);
    cout<<"排序后数组:"<<endl;
    display(a,n);

    return 0;
}

三、增量穷举求幂集

/*增量穷举法求幂集O(2^n)
*题目描述:
*给出一个整数n,求1~n构成集合的幂集
**/
#include <iostream>
#include<vector>
using namespace std;
vector<vector<int>> ps;
void PSet(int n)
{
    vector<vector<int>> ps1;
    vector<vector<int>>::iterator it;
    vector<int> s;
    ps.push_back(s);
    for(int i=1 ; i<=n;i++)
    {   ps1=ps;
        for(it = ps1.begin();it!=ps1.end();it++)
            it->push_back(i);
        for(it = ps1.begin();it!=ps1.end();it++)
            ps.push_back(*it);
    }
}
void displays()
{
    vector<vector<int>>::iterator it;
    vector<int>::iterator sit;
    for(it = ps.begin();it!=ps.end();it++)
    {   cout<<"{";
        for(sit = it->begin();sit !=it->end();sit++)
            cout<<*sit<<" ";
        cout<<"}"<<endl;
    }
}
int main()
{
    int n;
    cout<<"输入整数n:";
    cin>>n;
    PSet(n);
    cout<<"1~"<<n<<"的幂集为:"<<endl;
    displays();
    return 0;
}


结果:
结果

四、贪心算法(集装箱问题)

/*
*【问题描述】有n个集装箱要装上一艘载重量为W的轮船,其中集装箱i(l<i<n)的重量为w。
*不考虑集装箱的体积限制,现要选出尽可能多的集装箱装上轮船,使它们的重量之和不*超过W。
**/
#include <iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define MAXN 20       //最多集装箱个数

int w[] = {0,5,2,6,4,3};   //各箱子重量,忽略下标0的箱子
int n =5,W=10;
int maxW;
int x[MAXN];

void solve()
{
  memset(x,0,sizeof(x));
  sort(w+1,w+n+1);  //w[1..n]递增排序
  maxW =0;
  int restw = W;
  for(int i =1;i<=n&&w[i]<=restw;i++)
  {
      x[i]=1;   //选择集装箱i
      restw-=w[i];    //减少剩余重量
      maxW+=w[i];	  //累计装载总质量

  }
}


int main()
{
    solve();
    cout<<"最优方案:"<<endl;
    for(int i=0;i<=n;i++)
        if(x[i]==1)
          cout<<"选集装箱"<<i<<" 重量"<<w[i]<<endl;
    cout<<"总重量:"<<maxW<<endl;
    return 0;
}


运行结果:
1