博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1042: [HAOI2008]硬币购物
阅读量:5012 次
发布时间:2019-06-12

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

Description

  硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次

带di枚ci硬币,买s的价值的东西。请问每次有多少种付款方法。

Input

  第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s,其中di,s<=100000,tot<=1000

Output

  每次的方法数

Sample Input

1 2 5 10 2
3 2 3 1 10
1000 2 2 2 900

Sample Output

4
27
 
题目大意:
容量为s的背包。每个物品的体积ci和数量si,求有多少种
方案将背包正好填满。
 
题解:dp预处理+容斥原理
预处理出没有数量限制下的方案数,再容斥减去超过物品数量的方案数
总的方案数-一个物品超出限制的方案数+两个物品超出限制的方案数-三个物品超出
限制的方案数+4个物品超出限制的方案数。
 
代码:
#include
#include
using namespace std;int tot,sum;int c[7],d[7];long long ans,f[100009];void dfs(int now,int cnt,int sum){ if(now==5){ if(cnt&1)ans-=f[sum]; else ans+=f[sum]; return; } dfs(now+1,cnt,sum); if(sum-(d[now]+1)*c[now]>=0) dfs(now+1,cnt+1,sum-(d[now]+1)*c[now]);}int main(){ scanf("%d%d%d%d%d",&c[1],&c[2],&c[3],&c[4],&tot); f[0]=1; for(int i=1;i<=4;i++) for(int j=c[i];j<=100000;j++) f[j]+=f[j-c[i]]; for(int i=1;i<=tot;i++){ ans=0; scanf("%d%d%d%d%d",&d[1],&d[2],&d[3],&d[4],&sum); dfs(1,0,sum); cout<
<

 

转载于:https://www.cnblogs.com/zzyh/p/7645757.html

你可能感兴趣的文章
织梦DEDE多选项筛选_联动筛选功能的实现_二次开发
查看>>
iOS关于RunLoop和Timer
查看>>
SQL处理层次型数据的策略对比:Adjacency list vs. nested sets: MySQL【转载】
查看>>
已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。
查看>>
MySQL的随机数函数rand()的使用技巧
查看>>
thymeleaf+bootstrap,onclick传参实现模态框中遇到的错误
查看>>
python字符串实战
查看>>
wyh的物品(二分)
查看>>
12: xlrd 处理Excel文件
查看>>
综合练习:词频统计
查看>>
中文url编码乱码问题归纳整理一
查看>>
Cesium应用篇:3控件(3)SelectionIndicator& InfoBox
查看>>
58. Length of Last Word(js)
查看>>
前端面试题汇总(持续更新...)
查看>>
如何成为F1车手?
查看>>
QT自定义消息
查看>>
Save (Not Permitted) Dialog Box
查看>>
装饰模式(Decorator)
查看>>
任务13:在Core Mvc中使用Options
查看>>
利用Excel 2010数据透视图实现数字的可视化的图形直观展示
查看>>