434
社区成员
发帖
与我相关
我的任务
分享代码如下:
#include<iostream>
using namespace std;
int a[1000];
void swap(int &x,int &y){
int tmp;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int n,m;
cin >>n >>m;
for (int i = 0;i < n;i++)
cin >> a[i];
for (int i = 0;i<n;i++)
for (int j = 0;j < n-1;j++){
if (a[j] > a[j+1])
swap(a[j],a[j+1]);
}
int sum = 0,k = 0;
for (int i = 0;i < n;i++){
sum += a[i];
k+=1;
if (sum > m){
cout << k-1;
break;
}
if (sum <= m && i == (n-1))
cout <<k;
}
}
贪心策略:
求固定长度的磁带上存放的最多程序,即将程序放在磁带上的长度降序排列,然后从最小长度开始选择,最后得到最优解
反证法:
在第一次可以选择最小程序的前提下,假设在最优解中去掉第一次选择的最小程序后得到的子问题的最优解的t0大于原问题最优解的t1,那么将最小程序加入选择产生的解的t2大于t1,此时t1不是最优解,这不成立。故此问题具有最优子结构性质。
时间复杂度分析:
排序O(nlogn) + 循环O(n) ,故时间复杂度为O(nlogn)。
贪心法是指在求解问题的途中,总是做出在当前情况下最优的选择,即不在总体上考虑,只做出局部的最优解,贪心法的求解问题效率高,同时代码简单,对于解决一个问题选择使用贪心算法首先要确定其是否具有贪心选择性质和最优子结构性质,然后确保贪心策略是否正确