求一个贪心算法!

编程有钱人了 2017-02-10 09:31:17
2元可以买一瓶啤酒,4个瓶盖可以换一瓶,2个空瓶可以换一瓶,,10元最多可以喝多少瓶?
...全文
334 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cpycpy000 2017-02-10
  • 打赏
  • 举报
回复
哦 _cap = 0; _empty = 0; 这两个可以不写,之前显示没改
cpycpy000 2017-02-10
  • 打赏
  • 举报
回复
那按照 单次最多能借一瓶,借到两瓶就要还债的想法来写的话:

        private int _wine = 0;
        private int _cap = 0;
        private int _empty = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            int money = int.Parse(textBox1.Text.Trim());
            int i = money / 2;
            setWine(i);
            textBox2.Text = _wine.ToString();
            textBox3.Text = _cap.ToString();
            textBox4.Text = _empty.ToString();
        }
        private void setWine(int w)
        {
            _wine = w;
            _cap = w;
            _empty = w;
            s();
            if(_cap == 3 && _empty == 1)
            {
                _wine++;
                _cap++;
                _empty++;
                s();
                _wine++;
                _cap = 0;
                _empty = 0;
            }
            else if (_cap == 3 || _empty == 1)
            {
                _wine++;
                _cap = 0;
                _empty = 0;
            }
        }
        private void s()
        {
            while (_cap >= 4)
            {
                _wine++;
                _empty++;
                _cap -= 3;
            }
            while (_empty >= 2)
            {
                _wine++;
                _cap++;
                _empty--;
            }
            if (_cap >= 4 || _empty >= 2)
                s();
        }
我觉得这店吃枣药丸_(:3ゝ∠)_
crystal_lz 2017-02-10
  • 打赏
  • 举报
回复
引用 11 楼 crystal_lz 的回复:
[quote=引用 10 楼 starfd 的回复:] 20瓶实际是不可能的,按这个算法,我直接找老板说给我20瓶,喝完了我把其他的还给你,人家不打死你才怪 因为按这个算法,我一个空瓶子就要换对方2瓶
我说都是可以借用的情况下

10 / 2 = 5 瓶
5个盖子 = 1 瓶 【剩余1个盖子】
5个瓶子 = 2 瓶 【剩余1个瓶子】
---
多了3瓶
剩余盖子 1+3
剩余瓶子 1+3
===============
4个盖子 = 1 瓶  【剩余0个盖子】
4个瓶子 = 2 瓶  【剩余0个瓶子】
---
多了3瓶
剩余盖子 0+3
剩余瓶子 0+3
===============
3个盖子 = 0 瓶  【剩余3个盖子】
3个瓶子 = 1 瓶  【剩余1个瓶子】
---
多了1瓶
剩余盖子 3+1
剩余瓶子 1+1
===============
4个盖子 = 1 瓶  【剩余0个盖子】
2个瓶子 = 1 瓶  【剩余0个瓶子】
---
多了2瓶
剩余盖子 0+2
剩余瓶子 0+2
===============
2个盖子 = 0 瓶  【剩余2个盖子】
2个瓶子 = 1 瓶  【剩余0个瓶子】
---
多了1瓶
剩余盖子 2+1
剩余瓶子 0+1
===================已经不够换 如果不能接到此为止 15 瓶
预先借用  1 瓶
---
多了1瓶
剩余盖子 3+1
剩余瓶子 1+1
===============
4个盖子 = 1 瓶  【剩余0个盖子】
2个瓶子 = 1 瓶  【剩余0个瓶子】
---
多了2瓶
剩余盖子 0+2
剩余瓶子 0+2
===============
2个盖子 = 0 瓶  【剩余2个盖子】
2个瓶子 = 1 瓶  【剩余0个瓶子】
---
多了1ping
剩余盖子 2+1
剩余瓶子 0+1
==================还是不够换了
预先借用  1 瓶
---
多了1瓶
剩余盖子 3+1
剩余瓶子 1+2
====刚好兑换两瓶 还掉 所以一共最多 可以喝到20瓶
按照 【瓶】 字 对齐 加下去 就是总数[/quote] 额上面的 最后哪里打错了 应该是

多了1瓶
剩余盖子 3+1
剩余瓶子 1+1
====刚好兑换两瓶 还掉 所以一共最多 可以喝到20瓶
cpycpy000 2017-02-10
  • 打赏
  • 举报
回复
假设可以在还清账务的前提下先借1瓶来喝的话, 那么就能喝18瓶,剩下2个瓶盖,没有空瓶。
crystal_lz 2017-02-10
  • 打赏
  • 举报
回复
引用 10 楼 starfd 的回复:
20瓶实际是不可能的,按这个算法,我直接找老板说给我20瓶,喝完了我把其他的还给你,人家不打死你才怪 因为按这个算法,我一个空瓶子就要换对方2瓶
我说都是可以借用的情况下

10 / 2 = 5 瓶
5个盖子 = 1 瓶 【剩余1个盖子】
5个瓶子 = 2 瓶 【剩余1个瓶子】
---
多了3瓶
剩余盖子 1+3
剩余瓶子 1+3
===============
4个盖子 = 1 瓶  【剩余0个盖子】
4个瓶子 = 2 瓶  【剩余0个瓶子】
---
多了3瓶
剩余盖子 0+3
剩余瓶子 0+3
===============
3个盖子 = 0 瓶  【剩余3个盖子】
3个瓶子 = 1 瓶  【剩余1个瓶子】
---
多了1瓶
剩余盖子 3+1
剩余瓶子 1+1
===============
4个盖子 = 1 瓶  【剩余0个盖子】
2个瓶子 = 1 瓶  【剩余0个瓶子】
---
多了2瓶
剩余盖子 0+2
剩余瓶子 0+2
===============
2个盖子 = 0 瓶  【剩余2个盖子】
2个瓶子 = 1 瓶  【剩余0个瓶子】
---
多了1瓶
剩余盖子 2+1
剩余瓶子 0+1
===================已经不够换 如果不能接到此为止 15 瓶
预先借用  1 瓶
---
多了1瓶
剩余盖子 3+1
剩余瓶子 1+1
===============
4个盖子 = 1 瓶  【剩余0个盖子】
2个瓶子 = 1 瓶  【剩余0个瓶子】
---
多了2瓶
剩余盖子 0+2
剩余瓶子 0+2
===============
2个盖子 = 0 瓶  【剩余2个盖子】
2个瓶子 = 1 瓶  【剩余0个瓶子】
---
多了1ping
剩余盖子 2+1
剩余瓶子 0+1
==================还是不够换了
预先借用  1 瓶
---
多了1瓶
剩余盖子 3+1
剩余瓶子 1+2
====刚好兑换两瓶 还掉 所以一共最多 可以喝到20瓶
按照 【瓶】 字 对齐 加下去 就是总数
  • 打赏
  • 举报
回复
20瓶实际是不可能的,按这个算法,我直接找老板说给我20瓶,喝完了我把其他的还给你,人家不打死你才怪 因为按这个算法,我一个空瓶子就要换对方2瓶
飞天凤凰601 2017-02-10
  • 打赏
  • 举报
回复
引用 1 楼 diaodiaop 的回复:
2瓶, 因为再多我喝不下去了...
神评!
cpycpy000 2017-02-10
  • 打赏
  • 举报
回复

        private int _wine = 0;
        private int _cap = 0;
        private int _empty = 0;

        private void button1_Click(object sender, EventArgs e)
        {
            int money = int.Parse(textBox1.Text.Trim());
            int i = money / 2;
            setWine(i);
            textBox2.Text = _wine.ToString();
            textBox3.Text = _cap.ToString();
            textBox4.Text = _empty.ToString();
            _wine = 0;
            _cap = 0;
            _empty = 0;
        }

        private void setWine(int w)
        {
            _wine += w;
            _cap += w;
            _empty += w;
            s();
        }

        private void s()
        {
            while (_cap >= 4)
            {
                _wine++;
                _empty++;
                _cap -= 3;
            }
            while (_empty >= 2)
            {
                _wine++;
                _cap++;
                _empty--;
            }
            if (_cap >= 4 || _empty >= 2)
                s();
        }
我也只有15瓶,剩下3个瓶盖和1个空瓶子 如果能借空瓶子的话,这店家就倒闭了,所以不存在先借一瓶的说法。 如果能借瓶盖的话,就是17瓶,剩下2个瓶盖和1个空瓶子。 20瓶什么的,能这么计算?
crystal_lz 2017-02-10
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
static void BuyDemo(int money)
{
    int price = 2;
    int cap = 4;
    int empty = 2;

    int totalBottle = money / price;
    int nowCap = totalBottle;
    int nowEmpty = totalBottle;

    while (true)
    {
        int addCap = nowCap / cap;
        int addEmpty = nowEmpty / empty;
        if (addCap > 0 || addEmpty > 0)
        {
            int addBottle = addCap + addEmpty;
            totalBottle += addBottle;
            nowCap = nowCap % cap + addBottle;
            nowEmpty = nowEmpty % empty + addBottle;
        }
        else
        {
            break;
        }
    }
    Console.WriteLine(totalBottle);
}
结果居然有15瓶,难道是我写错了?
啤酒2元一瓶 瓶盖5毛一个 空瓶1元一个 所以一瓶啤酒只需要话费 0.5 元 所以最多可以 10 / 0.5 = 20 瓶
拜一刀 2017-02-10
  • 打赏
  • 举报
回复
15瓶考虑借空瓶了吗?
Poopaye 2017-02-10
  • 打赏
  • 举报
回复
const int 一瓶啤酒的钱 = 2;
const int 瓶盖换啤酒比 = 4;
const int 空瓶换啤酒比 = 2;

var 钱 = 10;
var 总共喝到的啤酒 = 0;
var 还没喝的啤酒 = 0;
var 空瓶 = 0;
var 瓶盖 = 0;

while (true)
{
	//瓶盖换啤酒
	if (瓶盖 >= 瓶盖换啤酒比)
	{
		还没喝的啤酒 += (瓶盖 / 瓶盖换啤酒比);
		瓶盖 %= 瓶盖换啤酒比;
	}
	//空瓶换啤酒
	if (空瓶 >= 空瓶换啤酒比)
	{
		还没喝的啤酒 += (空瓶 / 空瓶换啤酒比);
		空瓶 %= 空瓶换啤酒比;
	}
	//花钱买啤酒
	if (钱 >= 一瓶啤酒的钱)
	{
		还没喝的啤酒 += (钱 / 一瓶啤酒的钱);
		钱 %= 一瓶啤酒的钱;
	}
	//喝啤酒
	if (还没喝的啤酒 > 0)
	{
		总共喝到的啤酒 += 还没喝的啤酒;
		空瓶 += 还没喝的啤酒;
		瓶盖 += 还没喝的啤酒;
		还没喝的啤酒 = 0;
	}
	else
		break;
}

Console.WriteLine("总共喝了:" + 总共喝到的啤酒);
居然只有15瓶
编程有钱人了 2017-02-10
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
static void BuyDemo(int money)
{
    int price = 2;
    int cap = 4;
    int empty = 2;

    int totalBottle = money / price;
    int nowCap = totalBottle;
    int nowEmpty = totalBottle;

    while (true)
    {
        int addCap = nowCap / cap;
        int addEmpty = nowEmpty / empty;
        if (addCap > 0 || addEmpty > 0)
        {
            int addBottle = addCap + addEmpty;
            totalBottle += addBottle;
            nowCap = nowCap % cap + addBottle;
            nowEmpty = nowEmpty % empty + addBottle;
        }
        else
        {
            break;
        }
    }
    Console.WriteLine(totalBottle);
}
结果居然有15瓶,难道是我写错了?
这应该是答案了
  • 打赏
  • 举报
回复
static void BuyDemo(int money)
{
    int price = 2;
    int cap = 4;
    int empty = 2;

    int totalBottle = money / price;
    int nowCap = totalBottle;
    int nowEmpty = totalBottle;

    while (true)
    {
        int addCap = nowCap / cap;
        int addEmpty = nowEmpty / empty;
        if (addCap > 0 || addEmpty > 0)
        {
            int addBottle = addCap + addEmpty;
            totalBottle += addBottle;
            nowCap = nowCap % cap + addBottle;
            nowEmpty = nowEmpty % empty + addBottle;
        }
        else
        {
            break;
        }
    }
    Console.WriteLine(totalBottle);
}
结果居然有15瓶,难道是我写错了?
拜一刀 2017-02-10
  • 打赏
  • 举报
回复
全买了,能换的就换,换到最后看能不能抖个机灵借瓶子就完了吧 当然你要是一瓶子把老板撂倒...
by_封爱 版主 2017-02-10
  • 打赏
  • 举报
回复
2瓶, 因为再多我喝不下去了...

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧