一、題目
二、思考
背包問題: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;}