/* 1)贪心的基本思想:求解最优化问题的算法通常要
经过一系列步骤,每个步骤都面临多种选择,
它在每个决策点作出在当时看来最佳的选择,
即总是遵循某种规则,做出局部最优的选择,
以推导出全局最优解(局部最优解->全局最
优解)
2)两个要素:贪心选择性质+最优子结构
1.贪心选择性质:进行选择时,直接做出在
当前问题中看来最优的选择(局部最优
解->全局最优解),而不必考虑子问题
的解(无后效性)。
2.最优子结构:如果一个问题的最优解包含其
子问题的最优解,则称此问题具有最优
子结构性质。
3)贪心算法的基本步骤:
1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解*/
/*1.矩阵选数问题
在N行M列的正整数矩阵中,要求从每行中选出1个数,使得
选出的总共N个数的和最大。(1<=N, M<=100,结果在int
范围内)
#include <iostream>
using namespace std;
int a[110][110];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>a[i][j];
}
}
int mmm,sum;
for(int i=0;i<n;i++)
{
int mmm=a[i][0];
for(int j=0;j<m;j++)
{
if(a[i][j]>mmm) a[i][j]=mmm;
}
sum=sum+mmm;
}
cout<<sum<<endl;
return 0;
}*/
/*2.钱币找零问题
有1元、5元、10元、50元、100元、500元
的硬币各C1, C5, C10, C50, C100, C500枚。
现在要用这些硬币来支付A元,最少需要多少
枚硬币?若有解,输出最少硬币数;否则输出
“-1”(0<=C1, C5, C10, C50, C100, C500<=
109,0<=A<=109)
#include <iostream>
using namespace std;
int minn(int x,int y){return x>y?y:x;};
int main()
{
int n;
cin>>n;
int a[]={1 ,5, 10, 50, 100 ,500 };
int b[6];
for(int i=0;i<6;i++)
{
cin>>b[i];
}
int x,ans=0;
for(int i=5;i>=0;i--)
{
x=minn(n/a[i],b[i]);
ans=ans+x;
n=n-x*a[i];
}
if(n>0) cout<<-1<<endl;
else cout<<ans<<endl;
return 0;
}*/
/*3. “背包”相关问题
(Ⅰ)最优装载问题
有n个物体,第i个物体的重量为wi(wi为正整数)。
选择尽量多的物体,使得总重量不超过C。
【分析】由于只关心选择的物品的最大数量(而
不是最大重量,最大重量需要考虑DP),所以装
重的物体没有装轻的物体划算。这里只需对n个物
体按重量递增排序,依次选择每个物体直到装不
下为止。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
int a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int c;
cin>>c;
sort(a,a+n);
int sum=0,ans=0;
for(int i=0;i<n;i++)
{
if(sum+a[i]<c)
{
sum=sum+a[i];
ans++;
}
}
cout<<ans<<endl;
return 0;
}*/
#include <iostream>
using namespace std;
int main()
{
return 0;
}
贪心
最新推荐文章于 2023-06-25 00:01:59 发布