首页 > 其他 > 详细

hdu 2546 饭卡 01背包

时间:2014-03-04 12:00:29      阅读:455      评论:0      收藏:0      [点我收藏+]

分析:可以转化为01背包。。解决这个问题需要两个步骤。。

(1)留下5元钱去买最贵的菜。(要注意排除  m < 5 的情况)

(2)用剩下的 m-5 元去买尽量贵的菜。(01背包问题)

bubuko.com,布布扣
#include<iostream>
#include<string.h>
using namespace std;
int max(int a, int b)
{
    return a>b ? a : b;
}

int main()
{
    int n;
    while(cin>>n && n)
    {
        int i, j, m, c[1011], ma=0, f[1011], k;
        for(i=1; i<=n; i++)
        {
            cin>>c[i];
            if(ma<c[i])    {ma=c[i]; k=i;}  //找出最贵的菜 ma, 用k标记
        }
        cin>>m;
        if(m<5)    //m小于5,直接输出
        {
            cout<<m<<endl;
        }
        else
        {
            memset(f, 0, sizeof(f));
            for(i=1; i<=n; i++)
            {
                for(j=m; j>=0; j--)
                {
                    if(j>=c[i] && i!=k)
                    {
                        f[j]=max(f[j] , f[j-c[i]]+c[i]);    //状态转移方程
                    }
                }
            }
            cout<<m-f[m-5]-ma<<endl;    //f[m-5]剩下的钱买的最贵的菜,也可以在前面的循环中令j=m-5;
        }
    }
    return 0;
}
bubuko.com,布布扣

hdu 2546 饭卡 01背包,布布扣,bubuko.com

hdu 2546 饭卡 01背包

原文:http://www.cnblogs.com/xtaq/p/3579038.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!