1:部分背包问题
每次找单位价值最大的
代码:
public double selectMax() { double maxValue = 0.0; int sum = 0; int i; for(i = 0; i < v.length; i++) { if(sum + w[i] < weight) { sum += w[i]; maxValue += v[i]; } else break; } if(i < v.length && sum < weight) { maxValue += (double)(weight - sum) / w[i] * v[i]; } return maxValue; }这里省略了排序过程
这里省略了对数组v, w的定义。关键点在于我们选择了若干了物品后要判断是否装满了背包重量。如果没有,还要从后面的里面挑选一部分。所以有一个if(i < v.length && sum < weight)的判断。
在实现后我们来看该问题这种解法的时间复杂度,因为需要将数组排序,我们的时间复杂度为O(nlgn
2:硬币组合花费硬币最小的问题
每次找面值最大的且满足条件的硬币
3:磁带最小访问时间(附一个大神的链接:http://blog.csdn.net/insistgogo/article/details/11354633);即,这些文件按照访问概率由大到小存储到磁带上时,访问所有文件经过平均磁带长度,可得到最佳访问效率
每次找长度最小的
4:
每次找前缀最大的
5:区间覆盖问题
