hdu-2546 饭卡

题目

hdu-2546

分析

余额>=5就可以买任何商品(购买后余额可以为负),余额<5则不能购买任何商品,即使余额足够支付.
目标是使卡上的余额最少

这实际上是一个变形的背包问题,背包的容量就是卡上的余额而我们的目标就是尽量装满背包.

可以将背包的容量视为m-5,且去掉菜谱里最贵的菜,这样就是纯粹的01背包问题

AC代码

#include "bits/stdc++.h"
using namespace std;
int a[1010], f[1010];
int main(int argc, char const *argv[])
{
    int n, m, i, v;
    while(cin >> n && n){
        for(i = 0; i<n; i++)
            cin >> a[i];
        cin >> m;
        int V = m - 5;
        if(V<0){
            cout << m << endl;
            continue;
        }
        memset(f, 0, sizeof(f));
        int ans = 0, ansi;
        //找到并去掉最贵的菜
        for(i = 0; i<n; i++){
            if(a[i] > ans){
                ans = a[i];
                ansi=i;
            }
        }
        a[ansi] = 0;
        for(i=0;i<n;i++){
            for(v=V;v>=a[i];v--){//01背包
                f[v] = max(f[v], f[v-a[i]]+a[i]);
            }
        }
        cout << m-f[V]-ans << endl;
    }

    return 0;
}

posted @ 2017-08-30 17:37  lepeCoder  阅读(185)  评论(0编辑  收藏  举报