Coins HDU - 2844 POJ - 1742
多重背包可行性
当做一般多重背包,二进制优化
#include<cstdio>
#include<cstring>
int n,m,anss;
int a[],c[],f[];
int main()
{
int i,j,t;
scanf("%d%d",&n,&m);
while(n!=||m!=)
{
anss=;
memset(f,,sizeof(f));
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=n;i++)
scanf("%d",&c[i]);
f[]=;
for(i=;i<=n;i++)
{
t=;
while(c[i]>)
{
if(t>c[i]) t=c[i];
c[i]=c[i]-t;
for(j=m;j>=a[i]*t;j--)
f[j]|=f[j-a[i]*t];
t*=;
}
}
for(i=;i<=m;i++)
if(f[i])
anss++;
printf("%d\n",anss);
scanf("%d%d",&n,&m);
}
return ;
}
二进制优化+bitset压位
#include<cstdio>
#include<cstring>
#include<bitset>
using namespace std;
int n,m,anss;
int a[],c[];
bitset<> f;
int main()
{
int i,j,t;
scanf("%d%d",&n,&m);
while(n!=||m!=)
{
anss=;
f.reset();
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=n;i++)
scanf("%d",&c[i]);
f[]=;
for(i=;i<=n;i++)
{
t=;
while(c[i]>)
{
if(t>c[i]) t=c[i];
c[i]=c[i]-t;
f|=(f<<(a[i]*t));
t*=;
}
}
for(i=;i<=m;i++)
if(f[i])
anss++;
printf("%d\n",anss);
scanf("%d%d",&n,&m);
}
return ;
}
可以转换成完全背包
http://blog.csdn.net/ac_hell/article/details/51394432
(仅做记录)④对于朴素的方法,这个算法每次只记录一个bool值,损失了不少信息。在这个问题中,不光能够求出是否能得到某个金额,同时还能把得出了此金额时A_i还剩下多少个算出来,这样直接省掉了k那重循环。
我们优化dp的状态:
状态:dp[i][j] : = 用前i种硬币凑成j时第i种硬币最多能剩余多少个( - 1表示配不出来)
转移:
①若dp[i-1][j]>=0,即前i-1种可以配成j,所以根本用不到第i种,所以剩余C_i种 dp[i][j]=C_i
②若j<a[i] || dp[i][j-a[i]]<=0,由于dp[i-1][j]<0,所以要想配成j起码得要有第i种,若j<a[i]则第i种用不到,所以前i种仍配不到j,若dp[i][j-a[i]]<=0,则说明配成j-a[i]时第i种已经无剩余或者甚至无法配成j-a[i],更别说配成j了, dp[i][j]=-1
③其他情况,由于a[i]还有剩,所以dp[i][j]相当于在dp[i][j-a[i]]的基础上多使用了一个a[i],此时 dp[i][j]=dp[i][j-a[i]]-1
最终找出所有>=0的dp[n][i]个数就行了(1<=i<=m)
#include<cstdio>
#include<cstring>
#include<bitset>
using namespace std;
int n,m,anss;
int a[],c[];
int ans[];
int main()
{
int i,j,t;
scanf("%d%d",&n,&m);
while(n!=||m!=)
{
anss=;
memset(ans,-,sizeof(ans));
ans[]=;
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=n;i++)
scanf("%d",&c[i]);
for(i=;i<=n;i++)
for(j=;j<=m;j++)
if(ans[j]>=)
ans[j]=c[i];
else if(j<a[i]||ans[j-a[i]]<=)
ans[j]=-;
else ans[j]=ans[j-a[i]]-;
for(i=;i<=m;i++)
if(ans[i]>=)
anss++;
printf("%d\n",anss);
scanf("%d%d",&n,&m);
}
return ;
}
另:二进制优化+bitset压位比转成完全背包要快,可能常数优越?
Coins HDU - 2844 POJ - 1742的更多相关文章
- hdu 2844 poj 1742 Coins
hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正 ...
- 题解报告:hdu 2844 & poj 1742 Coins(多重部分和问题)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)
作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢htt ...
- Coins HDU - 2844
Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibix opened p ...
- Coins(HDU 2844):一个会超时的多重背包
Coins HDU 2844 不能用最基础的多重背包模板:会超时的!!! 之后看了二进制优化了的多重背包. 就是把多重转变成01背包: 具体思路见:http://www.cnblogs.com/tt ...
- HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...
- [POJ 1742] Coins 【DP】
题目链接:POJ - 1742 题目大意 现有 n 种不同的硬币,每种的面值为 Vi ,数量为 Ni ,问使用这些硬币共能凑出 [1,m] 范围内的多少种面值. 题目分析 使用一种 O(nm) 的 D ...
- poj 1742(好题,楼天城男人八题,混合背包)
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 33269 Accepted: 11295 Descripti ...
- HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)
Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...
随机推荐
- Meteor Assets资源
静态服务器资源位于应用程序内的 private 子文件夹.在这个例子中,我们将学习如何从简单的JSON文件中使用数据. 第1步 - 创建文件和文件夹 让我们创建一个 private 文件夹并在这个文件 ...
- 火狐浏览器Firefox 如何下载网页的SWF视频,硅谷动力的网站视频怎么下载
1 使用火狐浏览器查看到底视频在哪里,我随便开了一段视频,发现这个SWF(外框套了一个Control.swf,内层才是真实的09-class.swf) 2 我们从下面这一段代码中进行分析 < ...
- Android从无知到有知——NO.6
紧随上一篇,说一下创建ip拨号器过程中出现的一些问题. 1)在一開始监听外拨电话的时候会报这样一个警告: Permission Denial: receiving Intent { act=andro ...
- FFMpeg2.4.2 on Ubuntu14.04
FFmpeg 2.4 "Fresnel" – is the leading multimedia framework, cross-platform solution tha ...
- Django创建数据表
Django中创建表. 用的django项目自带的sqlite数据库,创建完毕后将表注冊到jdango.admin,就能够在浏览器在管理了. 在django项目的models.py文件里: from ...
- vs2013发布网站提示 “未能将文件**复制到**”
原因:年久失修,原来在项目中的一些文件给删掉或移除了 解决方法:打开.csproj文件(记事本打开),把提示的文件给删除掉.
- Codeforces 440 D. Berland Federalization 树形DP,记录DP
题目链接:http://codeforces.com/contest/440/problem/D D. Berland Federalization Recently, Berland faces ...
- md5 js
js-md5 - npm https://www.npmjs.com/package/js-md5 var rotateLeft = function(lValue, iShiftBits) { re ...
- Linux设备驱动--块设备(三)之程序设计
块设备驱动注册与注销 块设备驱动中的第1个工作通常是注册它们自己到内核,完成这个任务的函数是 register_blkdev(),其原型为:int register_blkdev(unsigned i ...
- POJ3468 A Simple Problem with Integers —— 线段树 区间修改
题目链接:https://vjudge.net/problem/POJ-3468 You have N integers, A1, A2, ... , AN. You need to deal wit ...