博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二进制思想和多重背包问题
阅读量:6634 次
发布时间:2019-06-25

本文共 2586 字,大约阅读时间需要 8 分钟。

二进制思想

问题描述:

  假设有1000个苹果,现在要取n个苹果,如何取?正常的做法应该是将苹果一个一个拿出来,直到n个苹果被取出来。

  又假设有1000个苹果和10只箱子,如何快速的取出n个苹果呢?可以在每个箱子中放 2^i (i<=0<=n)个苹果,也就是 1、2、4、8、16、32、64、128、256、489(最后的余数),相当于把十进制的数用二进制来表示,取任意n个苹果时,只要推出几只箱子就可以了。

多重背包问题

问题描述:

  有N种物品和一个容量为V的背包。第 i 种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

问题分析:

 

  很容易想到可以把该问题转化成01背包问题来考虑,把每n[i] 中的每个物品都当成一个独立的物品,而这 n[i] 个物品能够表示的重量其实用 log n[i]个组合后的物品就能表示。

内层循环代码如下:

int k, t;k = 1;t = n[i];while(t > k){    for(j=W; j>=c[i]*k; --j)    {        f[j] = max(f[j], f[j-c[i]*k] + w[i]*k);    }    t -= k;    k *= 2;}for(j=W; j>=c[i]*t; --j){    f[j] = max(f[j], f[j-c[i]*t] + w[i]*t);}

poj上的1014是一道简单的多重背包问题。

源码如下:

View Code
1 #include 
2 #define max(x, y) ((x)>(y) ? (x) : (y)) 3 int f[80001]; 4 int main() 5 { 6 int c[7]; 7 int i, j; 8 int m = 0; 9 int nHarf = 0;10 while(scanf("%d %d %d %d %d %d", &c[1], &c[2], &c[3], &c[4], &c[5], &c[6]) )11 {12 if(c[1]==0 && c[2]==0 && c[3]==0 && c[4]==0 && c[5]==0 && c[6]==0)13 {14 break;15 }16 printf("Collection #%d:\n", ++m);17 nHarf = c[1]*1 + c[2]*2 + c[3]*3 + c[4]*4 + c[5]*5 + c[6]*6;18 if(nHarf%2 == 1)19 {20 printf("Can't be divided.\n\n");21 continue;22 }23 else24 {25 nHarf /= 2;26 }27 for(i=1; i<7; ++i)28 {29 if(c[i] == 0) continue;30 if(c[i]*i > nHarf)31 {32 for(j=i; j<=nHarf; ++j)33 {34 f[j] = max(f[j], f[j-i] + i);35 }36 }37 else38 {39 int k, t;40 k = 1;41 t = c[i];42 while(t > k)43 {44 for(j=nHarf; j>=i*k; --j)45 {46 f[j] = max(f[j], f[j-i*k] + i*k);47 }48 t -= k;49 k *= 2;50 }51 for(j=nHarf; j>=i*t; --j)52 {53 f[j] = max(f[j], f[j-i*t] + i*t);54 }55 }56 }57 if(f[nHarf] == nHarf)58 {59 printf("Can be divided.\n\n");60 }61 else62 {63 printf("Can't be divided.\n\n");64 }65 for(i=0; i<=nHarf; ++i)66 {67 f[i] = 0;68 }69 }70 return 0;71 }

 

 

转载于:https://www.cnblogs.com/favourmeng/archive/2012/09/07/2675580.html

你可能感兴趣的文章
Win10 IoT C#开发 4 - UART 串口通信
查看>>
UWP入门(一) -- 先写几个简单控件简单熟悉下(别看这个)
查看>>
Spring+CXF整合来管理webservice(服务器启动发布webservice)
查看>>
【Android】如何获取本机号码、IMSI、EMSI
查看>>
【解决 macos Sierra 系统「安全性与隐私」设置中没有任何来源选项问题】
查看>>
树莓派:文本编辑器与文件
查看>>
Ubuntu网络配置
查看>>
Common Lisp支持中文编辑和编译的windows下环境搭建志
查看>>
Java开发工具IntelliJ IDEA使用教程:创建新的Andriod项目
查看>>
css续集1
查看>>
http协议中的header详解
查看>>
使用common-codec进行md5加密
查看>>
MaxCompute应用限制整理
查看>>
聊聊sentinel的SimpleHttpCommandCenter
查看>>
Linux学习笔记第二周第四次课(2月1日)
查看>>
sqlserver用sql语句创建及查询链接服务器所有的数据库、用户和表
查看>>
JAVA for循环
查看>>
https证书一年多少钱?
查看>>
linux Screen的安装与简单应用
查看>>
【前端开发】JSON 完全自学手册
查看>>