典型的背包+容斥

首先,考虑如果没有个数的限制,那么就是一个完全背包,所以先跑一个完全背包,求出没有个数限制的方案数即可

接下来,如果有个数的限制,那么我们就要利用一些容斥的思想:没有1个超过限制的方案=至少0个超过限制-至少1个超过限制+至少2个超过限制-至少3个超过限制+至少4个超过限制

所以我们用2进制数枚举谁超过了限制,然后加入上面的容斥即可

其中:如果第i种硬币的限制为ni,那么如果i要求超过限制,那么至少要用ni+1个,所以i超过限制的方案数为f[s-(ni+1)ci](f[s]为全方案数)

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
ll dp[100005];
int c[5];
int l[5];
int q;
int cot(int sit)
{
int cnt=0;
if(sit&1)
{
cnt++;
}
if(sit&2)
{
cnt++;
}
if(sit&4)
{
cnt++;
}
if(sit&8)
{
cnt++;
}
return cnt;
}
int main()
{
for(int i=1;i<=4;i++)
{
scanf("%d",&c[i]);
}
dp[0]=1;
for(int j=1;j<=4;j++)
{
for(int i=1;i<=100000;i++)
{
if(i>=c[j])
{
dp[i]+=dp[i-c[j]];
}
}
}
scanf("%d",&q);
while(q--)
{
for(int i=1;i<=4;i++)
{
scanf("%d",&l[i]);
}
int s;
scanf("%d",&s);
ll ans=0;
for(int i=0;i<16;i++)
{
int temp=s;
if(cot(i)&1)
{
for(int j=0;j<4;j++)
{
if((1<<j)&i)
{
temp-=(l[j+1]+1)*c[j+1];
}
}
if(temp<0)
{
continue;
}else
{
ans-=dp[temp];
}
}else
{
for(int j=0;j<4;j++)
{
if((1<<j)&i)
{
temp-=(l[j+1]+1)*c[j+1];
}
}
if(temp<0)
{
continue;
}else
{
ans+=dp[temp];
}
}
}
printf("%lld\n",ans);
}
return 0;
}

bzoj 1042的更多相关文章

  1. [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】

    题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...

  2. BZOJ 1042 硬币购物(完全背包+DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1042 题意:给出四种面值的硬币c1,c2,c3,c4.n个询问.每次询问用d1.d2.d ...

  3. Bzoj 1042: [HAOI2008]硬币购物 容斥原理,动态规划,背包dp

    1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1747  Solved: 1015[Submit][Stat ...

  4. bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理

    题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1706  Solved: 985[Submit][ ...

  5. BZOJ 1042: [HAOI2008]硬币购物( 背包dp + 容斥原理 )

    先按完全背包做一次dp, dp(x)表示x元的东西有多少种方案, 然后再容斥一下. ---------------------------------------------------------- ...

  6. BZOJ 1042: [HAOI2008]硬币购物 [容斥原理]

    1042: [HAOI2008]硬币购物 题意:4种硬币.面值分别为c1,c2,c3,c4.1000次询问每种硬币di个,凑出\(s\le 10^5\)的方案数 完全背包方案数? 询问太多了 看了题解 ...

  7. ●BZOJ 1042 [HAOI2008]硬币购物

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1042 题解: 容斥原理,dp预处理首先跑个无限物品的背包dp求出dp[i]表示在四种物品都有 ...

  8. BZOJ 1042: [HAOI2008]硬币购物(容斥原理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1042 题意: 思路: 如果不考虑硬币个数的话,这就是一道完全背包的题目. 直接求的话行不通,于是这里 ...

  9. BZOJ 1042:[HAOI2008]硬币购物(容斥原理+DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1042 [题目大意] 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4. 某人去 ...

  10. BZOJ 1042: [HAOI2008]硬币购物 容斥+背包

    1042: [HAOI2008]硬币购物 Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请 ...

随机推荐

  1. box-shadow阴影覆盖问题

    “商品库”栏下方阴影被覆盖,解决方法:给“商品库”盒子加“position:relative”

  2. Grouping ZOJ - 3795 (tarjan缩点求最长路)

    题目链接:https://cn.vjudge.net/problem/ZOJ-3795 题目大意:给你n个人,m个关系, 让你对这个n个人进行分组,要求:尽可能的分组最少,然后每个组里面的人都没有关系 ...

  3. jsp映射为其他地址上去 ???

    在web.xml 里面配置servlet不起作用,所以配置jsp,然后在jsp里面跳转到servlet去   ???  第八天中的<08-jsp常用标签.avi> 在web.xml里面先设 ...

  4. 20165221 JAVA第一周学习心得及体会

    JAVA入门的理论学习 在JAVA2使用教程的网课学中,分为以下几个模块讲解的 JAVA的地位 JAVA的特点 安装JDK(Java Develepement Kit) Java程序的开发步骤 简单的 ...

  5. Informatic 使用过程中的问题

    1.database driver error ORA-12154 1)检查监听是否启动 2)是否在tnsnames.ora中配置

  6. SpringBoot实现标准的OAuth服务提供商

    ⒈添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  7. FAT文件系统规范v1.03学习笔记---4.文件和目录数据区之长目录项

    1.前言 本文主要是对Microsoft Extensible Firmware Initiative FAT32 File System Specification中文翻译版的学习笔记. 每个FAT ...

  8. Awk 命令学习总结、AWk命令系列学习(linux shell)

    AWK基本语法 下面没有提到awk命令怎么使用了,你可以通过 运行:awk –h 查询到所有命令及参数!下面把awk作为一门语言分节介绍. linux awk 内置变量使用介绍   awk语言中,怎么 ...

  9. git与eclipse集成之代码提交

    1.1. 代码提交 编码完成后,需要提交代码,例如新增文件git.txt 1.1.1.        提交代码到个人本地特性分支(commit) 选择工程,右键Team,Synchronize Wor ...

  10. DALSA相机开发--修改参数

    DALSA gige相机有两种方式可以获取到相机相关参数,一个是读取相机里面的xml文件:另外一个是读取相对应的寄存器的值. 对于修改寄存器的值,有两个相应的函数: 1)GevSetFeatureVa ...