hdu 2546 饭卡 01背包

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

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

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

#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;
}

 

posted @ 2014-03-03 20:15  xtaq  阅读(130)  评论(0编辑  收藏  举报