一.概念
在对问题求解时,总是做出在当前看来是最好的选择。通过局部最优选择从而得到全局最优解。
二.最优装载问题
题目描述:
这里有n个苹果分别重w1,w2,......,wn;和一个能承受m重量的袋子,最多能装多少苹果呢?
输入:
第一行输入n,m。分别表示有n个苹果和一个能承受m重的袋子。
第二行输入n个正整数,表示n个苹果分别重w1,w2,......,wn。
输出:
最多可以装下的苹果的个数。
样例输入:
6 30
10 15 6 8 12 3
样例输出:
4
解题思路:
肯定是从最小重量的苹果装起,每次都拿其中最小重量的苹果,这样就可以拿最多数量的苹果了。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[1001]; //存苹果的重量
int main(){
int n,m; //n为苹果的个数,m为袋子能承受的重量
int s=0,ans=0; //s为当前袋子所承受的重量,ans为苹果个数
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n); //排序;
for(int i=0;i<n;i++){
s+=a[i];
if(s<=m) ans++; //表示还能装下这一个苹果
else break;
}
cout<<ans<<endl;
return 0;
}
三.找零钱问题
题目描述:
现在需要找给客户n元,假设现在有面值为20,10,5,1的硬币,问至少找多少枚硬币。
输入:
一个整数n,表示一共要找的零钱
输出:
一个整数表示至少找多少枚硬币
样例输入:
33
样例输出:
5
解题思路:
易知要从10元面额的开始找,尽量每次都找最大面额的硬币。
代码:
#include<iostream>
using namespace std;
int a[4]={20,10,5,1};
int main(){
int n;
cin>>n;
int ans=0;
for(int i=0;i<4;i++){
while(n>=a[i]){
n-=a[i];
ans++;
}
}
cout<<ans<<endl;
return 0;
}