背包问题简单整理 - 君凌烟阁

jlyg 2021-08-13 原文


背包问题简单整理

 

hdu2546,01背包,需要有点变形,计算时需要把价格最大的菜先放一边,最后计算。

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std;
int V;
int dp[1200];
void ZeroOnePack(int ci,int wi)
{
    for(int v=V-5;v>=ci;--v)
        dp[v] = max(dp[v],dp[v-ci]+wi);
}
int main()
{
    //freopen("test.txt","r",stdin);
    int n;
    while(true)
    {
        scanf("%d",&n);
        if(n==0) break;
        memset(dp,0,sizeof(dp));
        int vi[1200];
        int iMaxIndex = 0;
        int iMaxVal = -10;
        for(int i=0;i<n;++i)
        {
            scanf("%d",&vi[i]);
            if(iMaxVal < vi[i])
            {
                iMaxIndex = i;
                iMaxVal = vi[i];
            }
        }
        scanf("%d",&V);
        if(V<5)
        {
            printf("%d\n",V);
        }
        else
        {
            for(int i=0;i<n;++i)
                if(i != iMaxIndex)
                    ZeroOnePack(vi[i],vi[i]);
            printf("%d\n",V-dp[V-5]-vi[iMaxIndex]);
        }
    }


    return 0;
}

View Code

 

hdu 2191 多重背包,多重背包主要可以分解成01背包和完全背包。

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<iterator>
#include<algorithm>
#include<cstring>
using namespace std;
int V,n;
int dp[200];
void ZeroOnePack(int vi,int wi)
{
    for(int v=V;v>=vi;--v)
        dp[v] = max(dp[v],dp[v-vi]+wi);
}
void CompletePack(int vi,int wi)
{
    for(int v=vi;v<=V;++v)
        dp[v] = max(dp[v],dp[v-vi]+wi);
}
void MultiPack(int vi,int wi,int ki)
{
    if(vi*ki >= V)
    {
        CompletePack(vi,wi);
    }
    else
    {
        for(int k=1;k<ki;k*=2)
        {
            ZeroOnePack(k*vi,k*wi);
            ki -= k;
        }
        ZeroOnePack(ki*vi,ki*wi);
    }
}
int main()
{
    //freopen("test.txt","r",stdin);
    int c;
    scanf("%d",&c);
    while(c--)
    {
        memset(dp,0,sizeof(dp));
        scanf("%d%d",&V,&n);
        int v[200],w[200],num[200];
        for(int i=0;i<n;++i)
        {
            scanf("%d%d%d",&v[i],&w[i],&num[i]);
        }
        for(int i=0;i<n;++i)
            MultiPack(v[i],w[i],num[i]);
        printf("%d\n",dp[V]);
    }


    return 0;
}

View Code

 

发表于
2019-02-05 21:08 
君凌烟阁 
阅读(243
评论(0
编辑 
收藏 
举报

 

版权声明:本文为jlyg原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jlyg/p/10353142.html

背包问题简单整理 - 君凌烟阁的更多相关文章

  1. AVIRIS 简介 – 愤怒的青蛙

    AVIRIS 简介 2020-05-31 15:41  愤怒的青蛙  阅读(1085)  评论(0)  编辑  […]...

  2. 在线CAD软件,在线CAD平台,网页CAD软件 – 梦想CAD控件

    在线CAD软件,在线CAD平台,网页CAD软件 MxDraw云图开发使用入门 1、 简介: 全新在线CAD平台 […]...

  3. 远程协助工具 – TeamViewer

    https://www.teamviewer.cn/cn/products/teamviewer/ 常用操作 […]...

  4. python爬虫实战:豆瓣模拟登录 + 影评爬取 + 词云制作

    项目描述 爬取豆瓣上关于《哪吒之魔童降世》的短评,并制作词云。 技术点: Python面向对象 模拟登陆,内容 […]...

  5. AppStore应用商店审核指南(中文版)–苹果官方应用审核标准 – 流れ星ーー

    AppStore应用商店审核指南(中文版)–苹果官方应用审核标准 前言 感谢您付出宝贵的才华与时间 […]...

  6. 我国医院信息系统面临七大挑战(转) – Waiwai2017

    View Post 我国医院信息系统面临七大挑战(转) 北京协和医院信息中心主任、中国电子学会中国医药信息学会 […]...

  7. 五、产品经理和客户经理的区别 – Hit-Kevin

    五、产品经理和客户经理的区别 客户经理就是和客户搞好关系,引导客户、发现机会、挑战大收获多。 客户经理的职责主 […]...

  8. Java实现银行卡号校验 – java疯子

    Java实现银行卡号校验   /** * 通过银行卡BIN号获取银行卡所属银行名称 */public clas […]...

随机推荐

  1. 最短路问题

      摘要:本文主要讲解在竞赛中如何求解图中存在环的最短路问题。其中涉及的算法有Floyd算法,Dijkstra […]...

  2. 线性代数之二——任意阶行列式的计算

    上一篇,我们讲到了二阶行列式的定义,接下来我们要将其拓展到任意阶的行列式。 在此之前,我们要讲一个叫做逆序数的 […]...

  3. Win 10安装Python及环境变量配置

    一、Windows系统 很多童鞋问之前的教程怎么没有介绍安装python3.5的,现予以补充更新一下。 (一) […]...

  4. 为Android Studio 项目手动下载gradle

    在http://developer.android.com/samples/index.html上下载的例子, […]...

  5. LinkedHashMap如何保证顺序性

    一. 前言 先看一个例子,我们想在页面展示一周内的消费变化情况,用echarts面积图进行展示。如下: 我们在 […]...

  6. 数据加密 第三篇:证书

    证书(Certificates)全称是公钥证书,是一种数字签名语句,它把公钥的值绑定到用户、设备或服务的ID上 […]...

  7. 数据分析中常见的6大类分析方法 – xuzhengzhu

    六大类分析方法概要说明   要使各种结构化的、非结构化的、海量的数据实现标准化、信息化,能够提供业务绩效评估、 […]...

  8. HTML5视频播放插件 video.js介绍

    video.js是一款很流行的html5视频播放插件。很适合在移动端播放视频(比如微信网页),功能强大,且支持 […]...

展开目录

目录导航