BZOJ-1042:硬币购物(背包+容斥)
2024-09-08 08:18:17
题意:硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买si的价值的东西。请问每次有多少种付款方法。
思路:这么老的题,居然今天才做到...背包的复杂度是比较高的。 加上tot次询问会爆炸。能不能预处理,然后容斥得到答案呢?
先求一个完全背包,求出方案数,dp[]。
然后对于具体的询问,减去不合法的情况 。
对于c[i],它发贡献是dp[S-c[i]*(d[i]+1)];
那么会重复减,所以又加回来...
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
using namespace std;
const int maxn=;
ll dp[maxn],c[],d[],S,ans;
void dfs(int pos,int num,ll sum)
{
if(pos==){
if(sum>=) {
if(num&) ans-=dp[sum];
else ans+=dp[sum];
}
return ;
}
dfs(pos+,num+,sum-c[pos]*(d[pos]+));
dfs(pos+,num,sum);
}
int main()
{
int Q;
rep(i,,) scanf("%lld",&c[i]);
dp[]=;
rep(i,,)
rep(j,c[i],) dp[j]+=dp[j-c[i]];
scanf("%d",&Q);
while(Q--){
rep(i,,) scanf("%lld",&d[i]);
scanf("%lld",&S); ans=; dfs(,,S);
printf("%lld\n",ans);
}
return ;
}
最新文章
- ASP.NET MVC 5调用其他Action
- 简单设置eworkflow条件的方式
- 自定义浏览器协议,实现web程序调用本地程序
- Rsync+lsync实现触发式实时同步
- 【CodeVS】p1299 切水果
- CSS打造经典鼠标触发显示选项
- jdk和eclipse位数不一致出错
- fastica matlab 转载
- 设计模式18---设计模式之策略模式(Strategy)(行为型)
- airdrop-ng/aircrack-ng
- 数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
- Android6.0运行时权限(基于RxPermission开源库)
- radio,check美化
- HDU 1115(求质量均匀分布的多边形重心 物理)
- 067 Flume协作框架
- mac OS X下Java项目环境搭建+IntelliJ IDEA Jrebel插件安装与破解+Office 2016破解版安装
- 关于如何食用Xcode——用mac的小蒟蒻
- Spring MVC和Spring Data JPA之按条件查询和分页(kkpaper分页组件)
- MFC数据库操作
- 移动App中常见的Web漏洞