/* 问题描述:n个作业<a1,a2,...,an>,对于任意一个作业aj对应的时间涉及到三个值:处理时间tj,效益pj,最后期限dj,那么在一个时间段内只能做一件事情 而且是要连续的情况下才可以完成,即要连续执行tj时间才可以,此外如果是在dj之前完成的话就可以获得pj,如果完成不了的话就没有这个pj; 思路:这是一个典型的背包问题0-1背包,那么先把背包问题做过介绍,背包问题是dp的典型例子,参考dd_engi的<<背包问题九讲>>的总结,这里只介绍前四种 背包问题;后面5种可以继续参考的; 1.0-1背包: 有N件物品以及容量V的背包,每一件物品i的的费用ci以及对应的价值为wi,求解把哪些物品放入背包以求得最后的价值最大。 解法:定义方程为f[i][v]意思为把前i件物品放入到容量为v的背包里面的价值,那么可得到最后的价值计算公式如下: f[i][v]=max(f[i-1][v],f[i-1][v-ci]+w[i]); 公式解释:上式涉及到的意思就是对于第i件物品的话是放还是不放的问题,如果放的最后价值以及不放的最后价值对应取最大的值,那么的话假如:1.不放 第i件物品不放的话,那么相应的价值转换为对于以及容量为v的背包,前i-1的物品的价值,因为第i个不放,容量还是v;2.放的话,就是第i件物品存放了, 那么对于前i-1的物品能够使用的空间就是v-ci,因为第i件物品是占用ci的容量的,此外的话对应的还有要第i件物品的价值就是wi了,添加之后就可以得到 最后的容量之和。 对于这种情况的话时间和空间复杂度是O(VN),可以使用方法进行对应的空间缩减以达到较好的程度使空间复杂度进行一个缩减, 2.完全背包:有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的 费用总和不超过背包容量,且价值总和最大 解法:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v}为优化公式。 3.多重背包:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}为解决的公式 4.混合三种背包问题:为以上三种的混合,具体见背包九讲 根据上面的式子就可以得到的是对于高效调度的问题就是可以如下的进行解决了:实际上就是0-1背包问题; */ #include <iostream> using namespace std; #define N 10 struct work { int num;//实际的个数 int t[N];//对应01背包问题,对应到本题目的背景下的话就是: int p[N]; int d[N]; int sum[N]; work(int n):num(n) { char c; cout<<"输入是刚好完成还是非刚好完成"<<endl;//根据背包的要求是把背包装满,还是不装满。 cin>>c;//输入的值y表示yes,n表示no if(c=='y')//需要是在背包刚好装满的时候进行求解得到的最高的价值 { sum[0]=0; for (int i=1;i<=num;++i) { sum[i]=-0xfffffff; t[i]=0; d[i]=0; p[i]=0; } t[0]=0; d[0]=0; p[0]=0; } else if(c=='n')//求总的价值最大,背包不一定装满。 { for (int j=0;j<=num;++j) { sum[j]=0; p[j]=0; t[j]=0; d[j]=0; } } } void init(); void method(int,int,int); int max(int,int); }; int work::max(int a,int b) { return a>b?a:b; } void work::init() { for (int i=1;i<=num;++i) { cin>>t[i]; cin>>d[i]; cin>>p[i]; } } void work::method(int cost,int weight,int deadline) {//这里的话我的理解就是:把一个大的背包换成小的背包问题进行解决,相应的有对应的子问题,对于最后的背包是否满的情况还是那样的解决 int v=deadline; for (;v>=cost;--v) { sum[v]=max(sum[v],(sum[v-cost]+weight)); } } int main() { int i; work wk(6); wk.init(); for (i=1;i<=wk.num;++i) { wk.method(wk.t[i],wk.p[i],wk.d[i]); } return 0; }
高效调度
最新推荐文章于 2024-09-27 23:29:29 发布