1.贪心算法在我看来就是每一步都是最优的选择,不断累加的局部最佳选择,最后得到的总结果就是最优解,但这个的前提是每次贪心选择的策划得当,如果策略没选好,最好的结果不一定是最优解,而且可供贪心选择的策略并不是唯一的,不同的选择策略可能最后得到的结果都是最优解。
2.
4-1 程序存储问题 (90分)
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
输入格式:
第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。
输出格式:
输出最多可以存储的程序数。
输入样例:
在这里给出一组输入。例如:
6 50
2 3 13 8 80 20
输出样例:
在这里给出相应的输出。例如:
5
#include<iostream> #include<algorithm> using namespace std; int main(){ int n,l,a[105]; cin >> n >> l; for(int i=0;i<n;i++){ cin >> a[i]; } sort(a,a+n); int count = 0; for(int i=0;i<n;i++){ if(l >= a[i]){ l -= a[i]; count++; } } cout << count << endl; return 0; }
我使用的是优先选择最短的磁带,
已知样例的最优解为: 2 3 8 13 20
假设最短优先的选择策略得到的结果不算最优解,则最短优先得到的结果:2 3 8 13 20 不是最优解,与已知的结论矛盾,所以最短优先选择策略可以得到最优解。
3.
这章的题目不算太难,但也是有难点的,比如4-2 删数问题,我与同伴的想法一开始是一样的,但是后来我发现错误,我们的做法改变了原本的排序,我跟我的同伴说了错误的原因,以及应该如何避免错误,但是他有点固执,不过后面他也及时发现了错误,并且找到了正确的解法,还交会我怎么才是正解(感动),结对编程真的太棒了!