zoukankan      html  css  js  c++  java
  • Hdu 2546 饭卡(01背包)

    题意: 如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。

    AC代码:

    #include<iostream>

    #include<algorithm>

    using namespace std;

     

    const int maxn = 1000 + 10;

     

    int value[maxn];

    int cost[maxn];

    int dp[maxn][maxn];

     

    int Max(int a, int b){

           return a > b ? a : b;

    }

     

    int main(){

           int n;

           int v;

           while(cin>>n, n){

                  for(int i=1; i<=n; i++){

                         cin>>cost[i];

                         value[i] = cost[i];

                  }

                  sort(cost + 1, cost + n + 1);               //注意条件最后一个只要剩余价值>5就可以放下一个任何一个,所以排序后选择最大价值的一个

                  sort(value + 1, value + n + 1);

                  int max = cost[n];

                  cin>>v;

                  if(v < 5){

                         cout<<v<<endl;

                         continue;

                  }

                  memset(dp, 0, sizeof(dp));

                  for(int i=1; i<=n - 1; i++){                     //二维数组,没有优化空间

                         for(int j=0; j<=v - 5; j++){

                                if(j >= cost[i]){

                                       dp[i][j] = Max(dp[i-1][j - cost[i]] + value[i], dp[i-1][j]);

                                }

                                else

                                       dp[i][j] = dp[i-1][j];

                         }

                  }

                  cout<<v - dp[n- 1][v - 5] - max<<endl;

           }

           return 0;

    }

  • 相关阅读:
    浅谈 facebook .net sdk 应用
    数据库中各种字符串的截取函数
    初、中、高级测试工程师面试题汇总(附答案)
    包管理器 scoop
    ModuleNotFoundError: No module named 'pymouse'解决办法
    Python 正则表达式(分组)
    7个Python实战项目代码,让你分分钟晋级大神!
    经典SQL查询题目
    linux中软件的安装和卸载方法
    测试常用工具
  • 原文地址:https://www.cnblogs.com/cbyniypeu/p/3529324.html
Copyright © 2011-2022 走看看