chapter 16 贪心算法

1.活动选择问题

16.1-1 运用动态规划解决活动安排问题

//
//  main.cpp
//  pearls
//
//  Created by YangKi on 16/03/20.
//  Copyright © 2016年 YangKi. All rights reserved.

#include <cstdio>
#include <iostream>

#define Num 11 //the num of activity

using namespace std;
int s[Num+2]={0, 1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12, 16};
int f[Num+2]={0, 4, 5, 6, 7, 9, 9, 10, 11, 12, 14, 16, 17};
int c[Num+2][Num+2];// sij 代表在ai结束之后,aj开始之前的活动集合,c[i][j]表示sij的最大相互兼容的活动子集的个数
int subset[Num+2][Num+2];

void activity_arrange()
{
    for (int i=0; i < Num+1; i++)
        c[i][i+1] = 0;
    
    for (int i=0; i < Num+2; i++)
    {
        for (int j=0; j < Num+2; j++)
        {
            subset[i][j]=-1;
        }
    }
    
    for (int j=2; j<=Num+1; j++)
    {
        for (int i=j-2; i>=0; i--)
        {
            //get c[i][j]
            int temp=0;
            for (int k=i+1; k<j; k++)
            {
                if (s[k]>=f[i] && f[k]<=s[j])
                {
                    if (c[i][k]+c[k][j]+1 > temp)
                    {
                        temp = c[i][k]+c[k][j]+1;
                        subset[i][j]=k;
                    }
                }
            }
            c[i][j]=temp;
        }
    }
}


void print_sub(int i, int j)
{
    if (subset[i][j] != -1)
    {
        printf("a_%d\n", subset[i][j]);
        print_sub(i, subset[i][j]);
        print_sub(subset[i][j], j);
    }
}

int main()
{
    activity_arrange();
    printf("num:%d\n", c[0][Num+1]);

    print_sub(0, Num+1);
    return 0;
}

2.贪心算法原理

16.2-1 0-1背包问题

基本的

//  main.cpp
// 
//  Created by YangKi on 16/03/21.
//  Copyright © 2016年 YangKi. All rights reserved.
//  0-1背包问题
#include <cstdio>
#include <iostream>
#define Num 3 //the num of goods
#define Volume 50 // the volume of bag
using namespace std;
int w[Num+1]={50, 10, 20, 30};
int v[Num+1]={0, 60, 100, 120};
int c[Num+1][Volume+1]; //c[i][j]表示到第i个商品为止,总重量为j的范围内,能够得到的最大的价值,c[Num][Volume]就是答案

void zero_one_pack()
{
    for (int i = 0; i <= Num; ++i)
    {
        for (int j = 0; j < w[i]; ++j)
            c[i][j]=0;
    }

    c[0][Volume]=0;

    for (int i = 1; i <= Num; ++i)
    {
        for (int j = w[i]; j <= Volume; ++j)//j>= w[i],否则根本连第i个都放不下,更不用提前i个的情况
        {
            if (w[i] <= Volume)
            {
                if (c[i-1][j] < c[i-1][j-w[i]]+v[i])
                {
                  c[i][j] = c[i-1][j-w[i]]+v[i];
                  printf("c[%d][%d]=c[%d][%d-%d]+v[%d]\n", i, j, i-1, j, w[i], i);
                }
                else
                {
                    c[i][j] = c[i-1][j];
                    printf("c[%d][%d]=c[%d][%d]\n", i, j, i-1, j);
                }
            }
            else//包放不下该物品
            {
                c[i][j]=c[i-1][j];//肯定不放了
            }
        }
    }
}

int main()
{
    zero_one_pack();
    printf("result:%d\n", c[Num][Volume]);

    return 0;
}

优化了空间的, 注意里面的遍历方向

//  main.cpp
// 
//  Created by YangKi on 16/03/21.
//  Copyright © 2016年 YangKi. All rights reserved.
//  0-1背包问题
#include <cstdio>
#include <iostream>
#define Num 3 //the num of goods
#define Volume 50 // the volume of bag
using namespace std;
int w[Num+1]={50, 10, 20, 30};
int v[Num+1]={0, 60, 100, 120};
int c[Volume+1]; 

void zero_one_pack()
{
    for (int i = 0; i <= Volume; ++i)
        c[i]=0;

    for (int i = 1; i <= Num; ++i)
    {
        for (int j = Volume; j >= w[i]; --j)//!!!!!!!!!!!!!!!!!!
        {
            if (c[j] < c[j-w[i]]+v[i])
                {
                    c[j] = c[j-w[i]]+v[i];
                    printf("c[%d]=c[%d-%d]+v[%d]\n", j, j, w[i], i);
                }
        }
    }
}

int main()
{
    zero_one_pack();
    printf("result:%d\n", c[Volume]);

    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 贪心算法 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上...
    fredal阅读 9,195评论 3 52
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 今天3月13日,在川大附小的听了武凤霞老师的《莫高窟》,引发了我许多的思考。在边听边记的过程中,我一直在思考何为名...
    流雨木阅读 367评论 0 0
  • CPU在一段较短的时间内,是对连续地址的一段很小的主存空间频繁地进行访问,而对此范围以外地址的访问甚少,这种现象称...
    lintong阅读 932评论 0 2
  • 海角 那蔚蓝色的 背包 画手腕上的 手表 喜欢看你的 微笑 总那么自信 骄傲 今天的天气 刚好 约好一起去 海角 ...
    我是个诗人很业余阅读 99评论 0 1