混合背包(背包03)

将01背包,完全背包,和多重完全背包问题结合起来,那么就是混合三种背的问题

根据三种背包的思想,那么可以得到
混合三种背包的问题可以这样子求解
  for(int i=1; i<=N; ++i)
    if(第i件物品是01背包)
      zeroOnePack(c[i],w[i]);
    else if(第i件物品是完全背包)
      completePack(c[i],w[i]);
    else if(第i件物品是多重完全背包)
      multiplePack(c[i],w[i],n[i]);
这样能得到最优解的原因是,因为前一层已经是得到最优解了,
当前层求解最优解的时候,我们考虑要使用三种背包中的哪一种方法
而不用考虑前一层是怎么得到最优解的

#include <stdio.h>
#include <string.h>
int cash;
int n[11],dk[11];
int dp[1000000];
inline int max(const int &a, const int &b)
{
    return a < b ? b : a;
}
void CompletePack(int cost)
{
    for(int i=cost; i<=cash; ++i)
        dp[i] = max(dp[i],dp[i-cost]+cost);
}
void ZeroOnePack(int cost)
{
    for(int i=cash; i>=cost; --i)
        dp[i] = max(dp[i],dp[i-cost]+cost);
}
void MultiplePack(int cnt, int cost)
{
    if(cnt*cost >=cash)//如果第i种物品的费用总和超过背包容量,那么就是完全背包问题
        CompletePack(cost);
    else
    {
        int k = 1;//二进制拆分
        while(k<cnt)//判断剩下的数字能不能够拆分为k
        {
            ZeroOnePack(cost*k);
            cnt -=k;
            k<<=1;
        }
        ZeroOnePack(cnt*cost);
    }
}
int main()
{
    //输入的处理以及函数的调用
    return 0;
}

如果对你有所帮助,别忘了加好评哦;么么哒!!下次见!88

时间: 2024-10-10 17:45:40

混合背包(背包03)的相关文章

完全背包(背包九讲)

题目: 有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 思路: 这个问题非常类似于01背包问题,所 不同的是每种物品有无限件.也就是从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取0件.取1件.取2件--等很多种.如果仍然按照解 01背包时的思路,令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值.仍然可以按照每种物品不同的策略写出状态转

hdu3535---AreYouBusy(混合分组背包,有坑点)

混合的分组背包,如果任意取,就是01背包 如果至多取一个,就是普通的分组背包 如果至少一个,就要考虑第一次和非第一次拿,注意由于体积可以为0,所以先得考虑非第一次拿的,不然某组的同一个物品会被计算2次 /************************************************************************* > File Name: hdu3535.cpp > Author: ALex > Mail: [email protected] >

nyoj860 又见01背包(背包变形)

题目860 题目信息 执行结果 本题排行 讨论区 又见01背包 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述     有n个重量和价值分别为wi 和 vi 的 物品.从这些物品中选择总重量不超过 W 的物品,求全部挑选方案中物品价值总和的最大值. 1 <= n <=100 1 <= wi <= 10^7 1 <= vi <= 100 1 <= W <= 10^9 输入 多组測试数据. 每组測试数据第一行输入,n 和 W .

[hdu2159]FATE二维多重背包(背包九讲练习)

解题关键:二维约束条件,只需加一维状态即可. 转移方程:$f[j][k] = \max (f[j][k],f[j - w[i]][k - 1] + v[i])$ 1 #include<bits/stdc++.h> 2 #define inf 0x3f3f3f3f 3 using namespace std; 4 typedef long long ll; 5 int w[122],v[122]; 6 int dp[122][122]; 7 int main(){ 8 int n,m,k,s;

01背包//简直要被这道题玩死(掀桌)

先上链接: 表格什么的最清楚了:http://blog.csdn.net/mu399/article/details/7722810 dd大大的背包九讲: —————————————————— 01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] } f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值. Pi表示第i件物品的价值. 决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中

Unity3D使用NGUI实现简单背包功能

前话 在许多类型游戏中我们经常会使用到背包,利用背包来设置相应角色属性,多了背包也会让游戏增色拓展不少. 那在Unity3D游戏开发中该如何编写背包系统呢?因为有高人开发了NGUI插件,因此我们进行简单编写代码设置即可实现一个简单的背包功能了. 准备工作 新建一个工程PackageDemo 导入NGUI包(最新版3.9.8版的正版89刀) 准备好图片素材,使用NGUI将其打包成图集 背包 背包格子 物品 简单背包功能实现 第一步,添加NGUI控件,使用素材 项目目录以及场景列表如下: 要注意的是

HDU 2159 FATE(二维完全背包)

中文题目就不用解释了   就是裸的二维完全背包 d[i][j]表示消耗i忍耐杀j个怪最多可获得的经验  然后就用完全背包来做了  二维背包背包不过是多了一重循环 <span style="font-family:Arial Black;">#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 105; int ma

HDU 1203 01背包

I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 23039    Accepted Submission(s): 9230 Problem Description Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了.要申请国外的任何大学,你都要交

HDU 2159 FATE(二维全然背包)

中文题目就不用解释了   就是裸的二维全然背包 d[i][j]表示消耗i忍耐杀j个怪最多可获得的经验  然后就用全然背包来做了  二维背包背包只是是多了一重循环 <span style="font-family:Arial Black;">#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 105; int ma

Euro Efficiency(完全背包)

Euro Efficiency Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) Total Submission(s) : 12   Accepted Submission(s) : 3 Problem Description On January 1st 2002, The Netherlands, and several other European countries aban