HDU 2546饭卡(DP—背包问题)

本文探讨了一种特殊的背包问题——如何在电子科大的食堂中,通过购买特定的食物组合来达到饭卡余额最小化的目标。该问题的特点在于购买前判断余额是否大于等于5元即可完成交易。文章提供了一个详细的解决方案,并附带了核心代码。

饭卡

Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 37896 Accepted Submission(s): 13005

Problem Description
电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。
某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。

Input
多组数据。对于每组数据:
第一行为正整数n,表示菜的数量。n<=1000。
第二行包括n个正整数,表示每种菜的价格。价格不超过50。
第三行包括一个正整数m,表示卡上的余额。m<=1000。

n=0表示数据结束。

Output
对于每组输入,输出一行,包含一个整数,表示卡上可能的最小余额。

Sample Input
1
50
5
10
1 2 3 2 1 1 2 3 2 1
50
0

Sample Output
-45
32

Source
UESTC 6th Programming Contest Online

题解

典型背包问题,解析都在注释中了
背包问题核心代码(不对应下面的解题代码)

            //v为背包容量
            //n为有n件物品
            //v[i]第i件物品的体积
            //c[i]第i件物品的价值
            //求将哪些物品放入背包可使价值总和最大
            //以下是核心代码
            for(i=0;i < n;i++)
            {
                for(j=v;j>=0;j--)
                {
                    if(j>=v[i])
                    {
                        dp[j]=max(dp[j],dp[j-v[i]]+c[i]);// dp[j]代表原本背包总价值,dp[j-v[i]]+c[i]代表第i个物品放入背包的总价值
                    }   
                }   
            } 

代码


    //背包问题,此背包的物品价值与体积相同
    //分下列几种情况
    //1、原本余额<5:输出余额
    //2、原本余额>所有物品价值:输出余额-物品总价值
    //3、排除以上两种方法,利用背包状态转移方程:dp[j]=max(dp[j],dp[j-v[i]]+c[i]);本题v[i]与c[i]相等,因为没有体积与价值区别
    //那么背包容量为m-5,那么求解出dp[m-5](dp[i]表示容量为i的背包能够获取的最大价值),剩下5元去买最大价值的东西
    //3方法max中dp[j]代表原本背包总价值,dp[j-v[i]]+c[i]代表第i个物品放入背包的总价值
    //如果dp[j]大,代表不将物品放入背包,反之将第i件物品放入背包 
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int main()
    {
        int n;
        while(cin>>n)
        {
            int a[1001]={0};
            int dp[1001]={0};
            int m;
            int all=0;
            if(n==0)
            {
                break;
            }
            for(int i=0;i<n;i++)
            {
                cin>>a[i];
                all+=a[i];
            }
            cin>>m;
            sort(a,a+n);
            if(m<5)
            {
                cout<<m<<endl;
                continue;
            }
            if(m>=all)
            {
                cout<<m-all<<endl;
                continue;
            }
            else{
                for(int i=0;i<n;i++)
                {
                    for(int v=m-5;v>=a[i];v--)
                    {
                        dp[v]=max(dp[v],dp[v-a[i]]+a[i]);//因为此背包的物品价值和体积相等 
                    }
                }
                int sum=m-dp[m-5]-a[n-1];
                cout<<sum<<endl;
            }
        }
        return 0;
    }
内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值