博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1742
阅读量:7004 次
发布时间:2019-06-27

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

题意:bool多重背包

分析:学了种很快的新方法,就是每次填f[j]时直接由f[j-weight[i]]推出,前提是num[j - weight[i]]<sum[i]num每填一行都要清零,num[j]表示当前物品填充j大小的包需要至少使用多少个

但是使用这种方法有一个条件,就是要求f数组只能是bool类型。否则会出错。

对于bool型则不会有性价比的问题,只有体积可达和不可达的问题,在可达前提下只要尽量少的使用当前物品即可,value型则不行,可达不一定少用当前物品,因为多用当前物品可能会获得高价值。 例如,如果当前物品性价比极高,那么对于任意大小的包都应该尽量多的当前物品以追求高价值,用上述方法会使得后面包容量足够大时,会有些位置(j=(sum[i]+1)*weight[i])因无法满足条件num[j - weight[i]]<sum[i](即之前已经把当前物品买完),而无法购买当前物品。

View Code
#include
<
iostream
>
#include
<
cstdio
>
#include
<
cstdlib
>
#include
<
cstring
>
using
namespace
std;
#define
maxn 105
#define
maxm 100005
bool
f[maxm];
int
used[maxm], num[maxn], value[maxn];
int
n, m;
void
input()
{
for
(
int
i
=
0
; i
<
n; i
++
)
scanf(
"
%d
"
,
&
value[i]);
for
(
int
i
=
0
; i
<
n; i
++
)
scanf(
"
%d
"
,
&
num[i]);
}
void
work()
{
memset(f,
0
,
sizeof
(f));
f[
0
]
=
true
;
int
sum
=
0
;
for
(
int
i
=
0
; i
<
n; i
++
)
{
memset(used,
0
,
sizeof
(used));
for
(
int
j
=
value[i]; j
<=
m; j
++
)
if
(
!
f[j]
&&
f[j
-
value[i]]
&&
used[j
-
value[i]]
<
num[i])
{
f[j]
=
true
;
used[j]
=
used[j
-
value[i]]
+
1
;
sum
++
;
}
}
printf(
"
%d\n
"
, sum);
}
int
main()
{
//
freopen("t.txt", "r", stdin);
while
(scanf(
"
%d%d
"
,
&
n,
&
m), n
|
m)
{
input();
work();
}
return
0
;
}

转载地址:http://bbutl.baihongyu.com/

你可能感兴趣的文章
Java语言Switch语句详解
查看>>
1009 Product of Polynomials
查看>>
SQL连接操作
查看>>
java_21 Set接口、HashSet类、LinkedSet类
查看>>
python re库的正则表达式学习笔记
查看>>
初识bigdata时的一些技能小贴士
查看>>
20170623_oracle_优化与体系结构
查看>>
面试题5:从尾到头打印链表
查看>>
求助,eclipse总是卡在building workspace-CSDN论坛
查看>>
Linux中设定umask的作用
查看>>
前端开发页面的性能优化方案总结
查看>>
微雪的Open103V STM32F103VET6 最新版的HAL库全套示例程序和手册
查看>>
【noip2009 普及】细胞问题
查看>>
我的blog
查看>>
Linux操作系统下三种配置环境变量的方法
查看>>
Centos下Subversion 服务器安装配置(转)
查看>>
python 的web ide 工具jupyter 在windows 上使用的简要教程
查看>>
2751: [HAOI2012]容易题(easy)
查看>>
图片上传代码
查看>>
如何确认软件测试结束的标准(系统可以上线)转
查看>>