贪心法就是遵循某种规则,不断地贪心地选取当前最优策略
硬币问题
最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。
思路:优先使用面值大的硬币。
注:贪心算法比动态规划要简单高效。
#include<iostream>
#include<cmath>
using namespace std;
const int V[6] = {1, 2, 5, 10, 50, 100}; //硬币面值
int C[100] ;
int solve(int n)
{
int ans = 0;
int A;
for(int j=0;j<n;j++)
{
for(int i=5;i>=0;i--)
{
A = C[j] / V[i]; //因为有硬币的面值所以这里写的很简单,用for循环就可以
C[j] -= A * V[i];
ans += A;
}
}
return ans;
}
int main()
{
int n, sum;
while(cin>>n,n!=0)
{
for(int i=0;i<n;i++)
cin>>C[i];
cout<<solve(n)<<endl;
}
return 0;
}
区间调度问题
有n项工作每项工作Si时间开始,Ti时间结束。问:最多能参加多少项工作。
思路:每次都选取结束时间最早的。
因为结束越早后面可选的工作就越多
未完待续