1. 问题描述:
2. 核心思想
问题结构分析——递推逻辑建立——自底向上计算——最优方案追踪
3. 算法伪代码
核心算法
3. Java代码实现
// activityChoose Algorithm
public class activityChoose {
private static class Activity{
int startTime;
int endTime;
int weight;
private Activity(int startTime, int endTime, int weight){
this.startTime = startTime;
this.endTime = endTime;
this.weight = weight;
}
}
private static void activityChoose(Activity[] S){
// 记录p:在a_i开始前最后结束的活动
int[] p = new int[S.length+1];
p[0] = 0;
p[1] = 0;
for(int i=2; i<=S.length; i++){
for(int j=i-1; j>0; j--){
if(S[j-1].endTime <= S[i-1].startTime){
p[i] = j;
break;
}
}
}
for(int i=1; i<=S.length; i++){
System.out.println(p[i]);
}
int[] D = new int[S.length+1];
int[] Rec = new int[S.length+1];
D[0] = 0;
// 动态规划
for(int j=1; j<S.length+1; j++){
if(D[p[j]]+S[j-1].weight > D[j-1]){
D[j] = D[p[j]] + S[j-1].weight;
Rec[j] = 1;
}else{
D[j] = D[j-1];
Rec[j] = 0;
}
}
// 输出方案
int k=S.length;
while(k > 0){
if(Rec[k] == 1){
System.out.println("选择:开始时间"+S[k-1].startTime+"结束时间"+S[k-1].endTime);
k = p[k];
}else{
k--;
}
}
}
// 按结束时间从小到大排序
private static void quickSortActivity(Activity[] S, int start, int end){
int i = start;
int j = end;
if (start < end){
Activity tmp = S[i];
while(i<j){
while(i<j && S[i].endTime <= S[j].endTime){
j--;
}
S[i] = S[j];
while (i < j && S[i].endTime >= S[j].endTime) {
i++;
}
S[j] = S[i];
}
S[i] = tmp;
quickSortActivity(S, start, i-1);
quickSortActivity(S, i+1,end);
}
}
public static void main(String[] args){
Activity[] S = new Activity[10];
S[0] = new Activity(1,4,1);
S[1] = new Activity(3,5,6);
S[2] = new Activity(0,6,4);
S[3] = new Activity(4,7,7);
S[4] = new Activity(3,9,3);
S[5] = new Activity(5,9,12);
S[6] = new Activity(6,10,2);
S[7] = new Activity(8,11,9);
S[8] = new Activity(8,12,11);
S[9] = new Activity(2,14,8);
quickSortActivity(S, 0, 9);
activityChoose(S);
}
}
4. 带权活动选择问题VS活动选择问题