算法设计与分析第四章作业

软工2103陈洪基 2022-11-21 22:47:46

程序存储问题

设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
输入格式:
第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。
输出格式:
输出最多可以存储的程序数。

1、贪心策略:
在定长磁带上存储程序,那么我们每次都尽可能选长度最小的程序,这样占用的磁带长度就更小,从而能存放的程序就更多。
步骤:
(1)采用排序,将待存储的程序按长度从小到大排;
(2)每次都选择长度最小的程序存入磁带,然后磁带可存长度更新,存入的程序数量再加一。

代码:

int main() {

    cin >> n >> L;

    for (int i = 0; i < n; i++) {

        cin >> li[i];

    }

    sort(li, li + n);

    for (int i = 0; i < n; i++) {

        if (L >= total + li[i]) {

            total += li[i];

            number++;

        }

    }

    cout << number;

    return 0;

}

2、反证法证明贪心选择性质:
假设程序P={1, 2, ...,n}按程序在磁带上的长度非递减排列,则程序1的长度最小。
我们假设A为最优解,且最先放进磁带的是程序k,若k=1,则A是一个以贪心选择开始的最优解。
若k>1,我们令B=A–{k}∪{1},因为程序 1 的长度小于程序 k 的长度,且 A中的程序个数与B相同,故B也是一个最优解,而B包含程序1,故总存在以贪心选择开始的最优存储方案。

3、时间复杂度分析:排序O(nlogn) + 循环O(n) ,故时间复杂度为O(nlogn)。

对贪心算法的理解

相对于动态规划,贪心算法在乎局部最优,从而找出整体解,但这个整体解不一定是整体最优解,所以贪心算法只能求满足某些约束条件的可行解的范围。贪心算法求解效率高,代码和思想也更加简单,我们使用贪心算法求解时,需要先考虑问题是否满足贪心选择性质和最优子结构性质,确定这两条性质之后才能使用贪心算法。

...全文
22 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

434

社区成员

发帖
与我相关
我的任务
社区描述
广东外语外贸大学信息科学与技术学院
算法 高校
社区管理员
  • brisksea
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧