贪心

/*  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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值