DP专题下的背包专题

其实就是PJ的那些东西了

主流的背包有三种:01背包,完全背包和多重背包

其中01背包和完全背包的转移就比较经典了,而多重背包也是在前两者基础上演变一下即可

1837

题意:有一个天平,上面有一些地方有钩子可以挂钩码。让你求当所有钩码都挂上去时共有多少种方案使天平平衡

很简单,每个钩码只能用一次,所以我们设f[i][j]表示用完前i个钩码天平的状态为j的方案数

注意此处j表示天平的状态,若j<0表示向左倾,j>0表示向右倾,当然,0表示平衡

于是转移便为:

f[i][j]+=f[i-1][j-w[i]*d[k]](1<=i<=n;k<=c)

这里为了处理下标为负数的情况只需要都加上一个数即可

CODE

#include<cstdio>
using namespace std;
const int MAX_TILT=7500,N=25;
int m,n,d[N],w[N];
long long f[N][(8000<<1)+10];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc(); bool flag=1;
while (ch<'0'||ch>'9') { if (ch=='-') flag=0; ch=tc(); }
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
x=flag?x:-x;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i,j,k;
read(m); read(n);
for (i=1;i<=m;++i)
read(d[i]);
for (i=1;i<=n;++i)
read(w[i]);
for (f[0][MAX_TILT]=1,i=1;i<=n;++i)
for (j=0;j<=MAX_TILT<<1;++j)
for (k=1;k<=m;++k)
if (j>=d[k]*w[i]) f[i][j]+=f[i-1][j-d[k]*w[i]];
printf("%lld",f[n][MAX_TILT]);
return 0;
}

1276

题意:给你一些钱的价值和它的数量,还有一个最大的价值。让你求最接近最大的价值且不超过最大的价值的价值和

布尔型多重背包即可

f[j]表示能否得到j这种价值,然后分情况做01背包和完全背包即可

这里对于01背包有一个优化:二进制分组

就是把一个数拆成几个2的幂次的数然后达到将原来的1~num[i]的枚举变成了log级别,一个实用的技巧

这里的多重背包模板也是非常不错的(清新自然),可以看一下

CODE

#include<cstdio>
#include<cstring>
using namespace std;
const int MAX_M=100005,N=15;
int num[N],w[N],m,n;
bool f[MAX_M];
inline void pack_01(int w)
{
for (register int i=m;i>=w;--i)
f[i]|=f[i-w];
}
inline void pack_cpt(int w)
{
for (register int i=w;i<=m;++i)
f[i]|=f[i-w];
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i;
while (scanf("%d%d",&m,&n)!=EOF)
{
memset(f,0,sizeof(f));
for (f[0]=1,i=1;i<=n;++i)
{
scanf("%d%d",&num[i],&w[i]);
if (num[i]*w[i]>=m) pack_cpt(w[i]); else
{
int k=1;
while (k<num[i])
{
pack_01(w[i]*k);
num[i]-=k; k<<=1;
}
pack_01(w[i]*num[i]);
}
}
for (i=m;i>=0;--i)
if (f[i]) { printf("%d\n",i); break; }
}
return 0;
}

POJ1807&&1276的更多相关文章

  1. 矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence

    题目传送门 /* 题意:加上适当的括号,改变计算顺序使得总的计算次数最少 矩阵连乘积问题,DP解决:状态转移方程: dp[i][j] = min (dp[i][k] + dp[k+1][j] + p[ ...

  2. POJ 1276 Cash Machine -- 动态规划(背包问题)

    题目地址:http://poj.org/problem?id=1276 Description A Bank plans to install a machine for cash withdrawa ...

  3. PKU 1276 Cash Machine

    <span style="color:#000099;">/* Cash Machine Time Limit: 1000MS Memory Limit: 10000K ...

  4. hdu 1276士兵队列问题【queue】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1276 士兵队列训练问题                                         ...

  5. ZOJ 1276 Optimal Array Multiplication Sequence(矩阵连乘)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1276 裸的矩阵连乘问题. #include<iostream> ...

  6. 【转载】poj 1276 Cash Machine 【凑钱数的问题】【枚举思路 或者 多重背包解决】

    转载地址:http://m.blog.csdn.net/blog/u010489766/9229011 题目链接:http://poj.org/problem?id=1276 题意:机器里面共有n种面 ...

  7. 51nod 1276

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1276 1276 岛屿的数量 题目来源: Codility 基准时间限制: ...

  8. codevs——1276 图标缩放

    1276 图标缩放 2012年CCC加拿大高中生信息学奥赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze 题解       题目描述 Descriptio ...

  9. POJ 1276 Cash Machine(多重背包的二进制优化)

    题目网址:http://poj.org/problem?id=1276 思路: 很明显是多重背包,把总金额看作是背包的容量. 刚开始是想把单个金额当做一个物品,用三层循环来 转换成01背包来做.T了… ...

随机推荐

  1. [我的阿里云服务器] —— WorkPress

    前言: WordPress是基于PHP和MYSQL编成的一套博客系统,因此一般会选择LAMP环境来让它最稳定地运行, 这里的LAMP指的是Linux.Apache.MySQL.PHP,我们我的阿里云服 ...

  2. Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究

    Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究 在github上阅览README.md以获得最佳阅读体验,点这里 v-for响应式key ...

  3. 70部MAYA灯光材质渲染教程合集

    MAYA灯光材质渲染教程合集 教程格式:MP4和flv 两种格式 使用版本:教程不是一年出的教程,各个版本都有 (教程软件为英文版) 清晰度:可以看清软件上的文字 语言:部分中文字幕,其他英文(通过看 ...

  4. zabbix系列之安全

    https://blog.csdn.net/xiaoyu_0217/article/details/73500125 存在问题: 1)zabbix的Admin口令太弱或使用默认口令(Admin/zab ...

  5. LeetCode题解之Convert Sorted List to Binary Search Tree

    1.题目描述 2.题目描述 使用快慢指针寻找链表中间值. 3.代码 TreeNode* sortedListToBST(ListNode* head) { if (head == NULL) retu ...

  6. 用烂点子打破沉默的"麦当劳理论"

    "麦当劳"理论是啥? 讨论周末聚餐去哪儿的时候,朋友们往往太过顾及彼此的想法,犹豫着等待其他人做决定. 当谁也不愿说出提议的时候, 我往往会耍一个花招:推荐去麦当劳吃. 宝贵的休息 ...

  7. Oracle 当数据库的表没有drop操作就可以通过如下方式恢复表数据

    --执行下列语句可查询出相关时间点 select * from sys.smon_scn_time order by time_dp desc; --执行下列语句可将某个时间点的数据恢复 insert ...

  8. 异常System.BadImageFormatException

    [问题描述] Server Error in '/' Application. Could not load file or assembly 'WebDemo' or one of its depe ...

  9. SQL Server 复制表结构、整表数据

    1.将表1结构复制到表2 SELECT * INTO 表2 FROM 表1 WHERE 1=2 2.将表1内容全部复制到表2 SELECT * INTO 表2 FROM 表1

  10. 配置nginx支持TP框架

    TP框架配置中默认URL_MODEL=1,而Nginx默认是不支持PATHINFO的.如果我们只想跑起来tp框架,很简单,只需到更改TP配置,设置URL_MODEL=3(兼容模式).但是如果要让Ngi ...