活動安排問題 貪心法解決


上次寫的0-1背包問題解決方法是動態規划,其實有的人一看到0-1背包問題時第一反應就是使用貪心法來解決問題。但是貪心法求的結果並不一定就是最優解,舉個例子:

      

用word畫的,質量不是很好,湊合着看吧先。。。 可以看出來,貪心法先放最大的最后卻不一定得到最大的價值。所以用貪心法解決0-1問題是不靠普的。說着說着就有點離題了~\(≧▽≦)/~啦啦啦

今天寫的問題的 活動安排問題,使用的是貪心法來解決的。

問題描述:

設有n個活動的集合E={1,2,.....,n},其中每個活動都要求使用同一個資源(如演講會場),而在同一時間內只有一個活動能使用這一資源。每個活動i都有一個要求使用該資源的起始時間Si和一個結束時間Fi,且Si<Fi。如果選擇了活動i,則他在改時間區間[Si,Fi]內占用資源,若區間[Si,Fi] 和區間[Sj,Fj]不相交,則稱活動i與活動j是相容的。活動安排問題是要求在所給的活動集合范圍內選出最大的相容的活動子集。

 問題解析:

 查找每個活動的結束時間,每一次選擇時查找具有最早結束時間的相容的活動,先把n個活動按時間的結束時間非減序排列,這樣,貪心選擇是取當前活動集合中結束時間最早的活動就歸結為取當前活動集合中排在最前面的活動。 

 下面是我寫的c語言代碼,雖然代碼不全是自己寫的(看了課本寫的),但是代碼運行還是沒有發現錯誤滴。。。自己運行着沒有錯誤。。。

 

#include<stdio.h>

void sort( int s[], int f[], int n) // 把各個活動的起始時間和結束時間按結束時間遞增排序
{
     int a,b;
     int i,j;
     for(i= 0;i<n;i++)
    {
         for(j=i+ 1;j<n;j++)
        {
             if(f[i]>f[j])
            {a=f[i];f[i]=f[j];f[j]=a;
            b=s[i];s[i]=s[j];s[j]=b;}
        }
    }
}


int activemanage( int s[], int f[], bool a[], int n)
{
    a[ 0]= 1;
     int i;
     int j= 1,count= 1;
     for(i= 1;i<n;i++)
    {
         if(s[i]>=f[j])
        {
            a[i]= 1;
            j=i;
            count++;
        }
         else a[i]= 0;
    }
     return count;
}

void main()
{
     int i,n;
     int p;
     int s[ 100],f[ 100];
     bool a[ 100];
    printf( " 輸入節目數:\n ");
    scanf( " %d ",&n);
    printf( " 請依次輸入節目的開始和結束時間\n ");
     for(i= 0;i<n;i++)
    {
        scanf( " %d %d ",&s[i],&f[i]);
    }
    sort(s,f,n);
    p=activemanage(s,f,a,n);
    printf( " 安排的節目個數為:%d\n ",p);
    printf( " 節目的選取情況為(0表示不選 1表示選取):\n ");
     for(i= 0;i<n;i++)
        printf( " %d  ",a[i]);
    printf( " \n ");
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM