SRM713 hard CoinsQuery

3 篇文章 0 订阅
1 篇文章 0 订阅

题目大意

给出n种物品,每种物品有无数个,物品i有其价值v[i]及其体积w[i],给出q个询问,每个询问给出一个数S,求所有选择物品的方案中总体积恰好为S的方案的最大价值,以及其方案数
一种方案可以描述成一个长度为k序列t,满足t[i]表示选择了第t[i]种物品
若两方案的k不同,两方案被视为不同
若两方案的k相同且存在i使得t1[i]!=t2[i],两方案被视为不同
1<=n,q,w[i]<=100
1<=v[i],S<=10^9

解法

很直观的思路是可以设DP,f[i]表示体积和为i时的最大价值,g[i]相应的表示方案数
那么转移就类似这样:
f[i]=max(f[i-w[k]]+v[k])
g可以在转移时计算
由于是max,那么就可以用快速幂计算
由于要计算g,那么可以定义一个类D={val,tot}
重定义加法:a+b=c
如果a.val=b.val 那么c.val=a.val,c.tot=a.tot*b.tot
如果a.val>b.val那么c.val=a.val,c.tot=a.tot
如果b.val>a.val那么c.val=b.val,c.tot=b.tot
重定义乘法:a*b=c那么c.val=a.val+b.val,c. tot=a.tot*b.tot
还要预处理转移矩阵的2次幂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值