bzoj1042 / HAOI 2008 硬币购物(容斥原理

Description

硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买s
i的价值的东西。请问每次有多少种付款方法。

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

分析

嘿嘿嘿容斥终于学有用了。
这题本质上求满足方程 x 1 c 1 + x 2 c 2 + x 3 c 3 + x 4 c 4 = s x_1c_1+x_2c_2+x_3c_3+x_4c_4=s x1c1+x2c2+x3c3+x4c4=s 的解,限制条件是 0 x i d i 0\leq x_i \leq d_i 0xidi
假设没有限制条件,这题就是一个完全背包。因此我们想办法往完全背包上靠。于是想到容斥原理。用总方案减去有 x i d i + 1 x_i \geq d_i + 1 xidi+1 的方案。后面就是一个容斥了。

代码如下

#include <bits/stdc++.h>
#define N 100005
#define LL long long
using namespace std;
int x[5], d[5];
LL f[N], t[17], s, ans;
int bit(int x){
	int s = 0;
	while(x){
		s++;
		x -= x&-x;
	}
	return s;
}
int main(){
	int i, j, n, m, T, cnt;
	for(i = 0; i < 4; i++) scanf("%d", &x[i]);
	scanf("%d", &T);
	f[0] = 1;
	for(i = 0; i < 4; i++)
		for(j = x[i]; j <= 100000; j++) f[j] += f[j - x[i]]; 
	while(T--){
		memset(t, 0, sizeof(t));
		for(i = 0; i < 4; i++) scanf("%d", &d[i]);
		scanf("%d", &s);
		ans = f[s];
		for(i = 0; i < 4; i++) t[1 << i] = (d[i] + 1) * x[i];
		for(i = 1; i < (1 << 4); i++){
			if(!t[i]) t[i] = t[i-(i&-i)] + t[i&-i];
			cnt = bit(i);
			if(s < t[i]) continue;
			if(cnt & 1) ans -= f[s - t[i]];
			else ans += f[s - t[i]];
		}
		printf("%lld\n", ans);
	}
	return 0;
}
各种题解及学习笔记~ 文章被收录于专栏

各种题解及学习笔记

全部评论

相关推荐

已经入职字节快一个月了,突然想起来之前那段时间的面经没有发,先发一下timeline吧。Tiktok&nbsp;内容安全平台(人才库电话捞我):电话10.28&nbsp;-&gt;&nbsp;一面10.30(我觉得你跟我们组业务挺match的,然后过了三天问hr挂了,应该是别人流程更快)阿里淘天:投递11.11-&gt;约面11.12-&gt;一面11.14(问得很简单,30分钟,手撕八股全过无后续)Kpi面腾讯wxg&nbsp;微信小程序:投递11.13&nbsp;-&gt;约面11.14-&gt;&nbsp;一面11.17&nbsp;(究极无敌拷打,问我多模态大模型涉及的算法?但是人很好)-&gt;11.19流程终止小红书&nbsp;风控平台:投递11.16&nbsp;—约面11.17&nbsp;&nbsp;-&gt;一面11.18&nbsp;(抽象的面试官,面试感觉一般,问得前端网页安全相关的,确实没准备)-&gt;11.20挂百度&nbsp;百家号:投递11.14&nbsp;—&gt;约面11.14&nbsp;-&gt;一面11.14(当场约2面)-&gt;二面11.24-&gt;口头告知offer,&nbsp;拒绝(原因是业务不太好)美团&nbsp;技术平台投递11.17&nbsp;-&gt;&nbsp;约面(忘记了,没多久)&nbsp;-&gt;一面11.19&nbsp;-&gt;二面11.21&nbsp;(字节offer不想面了)快手&nbsp;电商业务投递11.17&nbsp;-&gt;&nbsp;约面11.18&nbsp;-&gt;一面11.19&nbsp;-&gt;&nbsp;二面11.21(拒了)腾讯wxg&nbsp;微信支付(被捞):(直接发面试邮件)技术一面12.05&nbsp;-&gt;技术二面12.11&nbsp;-&gt;技术三面12.17&nbsp;-&gt;&nbsp;hr面已拒绝(了解业务后拒绝,但是有转正hc,感觉还蛮可惜)字节跳动&nbsp;xxxx:东家就不放具体的时间线了,大概是面完第二天就能知道结果,除了有几天ld请假了没填面评。不去wxg还有个原因是还在期末周,深圳学校来回太麻烦了,至少现在在的组感觉能学到很多的东西,自己的选择应该也没错。还是感概一下,一年前大二的时候投简历海投基本上石沉大海,无论大小厂约面比例很少。现在基本上投了就有面试,还都是以前梦寐以求的大厂,现在自己也有了更多的选择,也没有投太多简历。也感谢上一段实习的经历,很有意思的项目,无论是字节,腾讯,还是美团基本都有聊这个项目。面经需要等一下,也许等周末有空了再发给各位uu,感兴趣可以关注一下~有想要交流学习的同学也可以私信我,目前人在北京大钟寺~,可以找搭子~
正能量的牛可乐:这么多大厂面试下来,不仅摸清了不同公司的面试风格,还能精准避雷业务不匹配的岗位,血赚
实习简历求拷打
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务