演算法導論-15-7-達到最高效益的調度

來源:互聯網
上載者:User
一、題目

二、思考

背包問題:P01:
01背包問題。

令s[i,j]表示考慮前i個背包,在時間j之前能夠獲得的最大效益。

初始化:s[i][0] = 0

遞推公式:s[i][j] = max{s[i-1][j], s[i-1][j-time[i]+pro[i]),其中前者代表如果不處理第i個作業s[i][j]能取得的最大值,後者表示如果做第i個作業s[i][j]能取得的最大值。

最佳化:空間複雜度最佳化、常數最佳化

三、代碼

#include <iostream>#include <algorithm>using namespace std;#define N 10//最多N個任務#define M 10//任務的最後完成時間小於M//每個作業作為一個結點struct node{int time;//處理時間int productivity;//效益int deadline;//期限}work[N];//對所有作業按照期限從小到大排序bool cmp(node a, node b){return a.deadline < b.deadline;}int s[M] = {0};//01背包void ZeroOnePack(int cost, int weight, int V){int v;for(v = V; v >= cost; v--)        s[v] = max(s[v], s[v-cost] + weight);}int main(){int n, i, j, last, ret;while(cin>>n){last = -1;ret = 0;memset(s, 0, sizeof(s));//輸入n個作業for(i = 0; i < n; i++){//產生隨機的測試資料work[i].time = rand() % N;work[i].productivity = rand() % N;work[i].deadline = rand() % M;cout<<work[i].time<<' '<<work[i].productivity<<' '<<work[i].deadline<<endl;//cin>>work[i].time>>work[i].productivity>>work[i].deadline;//或自己輸入測試資料if(work[i].deadline > last)last = work[i].deadline;}//對所有作業按照期限從小到大排序sort(work, work + n, cmp);for(i = 0; i < n; i++){ZeroOnePack(work[i].time, work[i].productivity, work[i].deadline);}//輸出結果for(i = 0; i <= last; i++)if(s[i] > ret)ret = s[i];cout<<ret<<endl;}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.