HDU - 2844 Coins(多重背包+完全背包)
题意
给n个币的价值和其数量,问能组合成\(1-m\)中多少个不同的值。
分析
对\(c[i]*a[i]>=m\)的币,相当于完全背包;\(c[i]*a[i]<m\)的币则是多重背包,考虑用二进制优化解决。最后扫一遍\(dp[i]\)统计答案。
import java.util.*;
import java.math.*;
public class Main{
static int MAXN = 100005;
static int []dp = new int[MAXN];
static int []a = new int [MAXN];
static int []c = new int [MAXN];
static int n,m;
static void zero(int w,int v) {
for(int i=m;i>=w;--i) {
dp[i] = Math.max(dp[i], dp[i-w]+v);
}
}
static void complete(int w,int v) {
for(int i=w;i<=m;++i) {
dp[i] = Math.max(dp[i], dp[i-w]+v);
}
}
static void multiple(int w,int v,int c) {
if(c * w >= m) {
complete(w,v);
return;
}
int k = 1;
while(k<=c) {
zero(k*w,k*v);
c -= k;
k <<= 1;
}
zero(c*w,c*v);
}
public static void main(String []args) {
Scanner cin = new Scanner (System.in);
while(cin.hasNext()) {
n = cin.nextInt();
m = cin.nextInt();
if(n==0 && m==0) break;
for(int i=0;i<=m;++i) dp[i]=-1;
dp[0] = 0;
for(int i=1;i<=n;++i) {
a[i] = cin.nextInt();
}
for(int i=1;i<=n;++i) {
c[i] = cin.nextInt();
multiple(a[i],a[i],c[i]);
}
int res=0;
for(int i=1;i<=m;++i) {
if(dp[i]==i) {
res++;
}
}
System.out.println(res);
}
cin.close();
}
}
HDU - 2844 Coins(多重背包+完全背包)的更多相关文章
- hdu 2844 Coins (多重背包+二进制优化)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:多重背包 , dp[i] ,容量为i的背包最多能凑到多少容量,如果dp[i] = i,那么代表 ...
- HDU 2844 Coins (多重背包计数 空间换时间)
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- HDu -2844 Coins多重背包
这道题是典型的多重背包的题目,也是最基础的多重背包的题目 题目大意:给定n和m, 其中n为有多少中钱币, m为背包的容量,让你求出在1 - m 之间有多少种价钱的组合,由于这道题价值和重量相等,所以就 ...
- hdu 2844 coins(多重背包 二进制拆分法)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- hdu 2844 Coins 多重背包(模板) *
Coins Time Limit: 2000/1 ...
- 背包系列练习及总结(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 ...
- HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...
- hdu 2844 Coins (多重背包)
题意是给你几个数,再给你这几个数的可以用的个数,然后随机找几个数来累加, 让我算可以累加得到的数的种数! 解题思路:先将背包初始化为-1,再用多重背包计算,最后检索,若bb[i]==i,则说明i这个数 ...
- HDU 2844 Coins(多重背包)
点我看题目 题意 :Whuacmers有n种硬币,分别是面值为A1,A2,.....,An,每一种面值的硬币的数量分别是C1,C2,......,Cn,Whuacmers想买钱包,但是想给人家刚好的钱 ...
随机推荐
- docker tag 详解
docker tag 用于给镜像打标签,语法如下: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] ① 比如我现在有一个 centos 镜像: [ro ...
- osgEarth2.8添加模型
#include <osgEarthDrivers/model_simple/SimpleModelOptions> SimpleModelOptions modelOptions; mo ...
- ios 图片处理( 1.按比例缩放 2.指定宽度按比例缩放
本文转载至 http://blog.sina.com.cn/s/blog_6f29e81f0101tat6.html //按比例缩放,size 是你要把图显示到 多大区域 CGSizeMake(300 ...
- shell 强大的awk
from here 小用法,使用awk来对文件随机抽取n行 awk 'BEGIN{srand()} {print rand()"\t"$0}' input_file | sort ...
- 使用Martix来实现缩放图片的功能
使用Martix(android.graphics.Matrix)类中的postScale()方法结合Bitmap来实现缩放图片的功能 Bitmap bmp = BitmapFactory.decod ...
- android 软键盘回车键捕获
EditText editText2 = (EditText)findViewById(R.id.txtTest2); editText2.setOnEditorActionListener(new ...
- 从一个多项目Web工程看Eclipse如何导入Gradle项目
这里再次说一下为什么我们需要熟悉Gradle构建工具,主要原因就是很多开源项目现在都在改用Gradle作为构建工具.一部分的github上的示例代码也在用Gradle构建,如果还是只能用maven,那 ...
- centos samba搭建
1.需求: 建立两个用户(zx,zxadmin),zxadmin能访问所有目录,zx只能访问指定目录. 2.安装smb [root@vi /]# yum install samba -y 3.创建用户 ...
- 爬虫实战【3】Python-如何将html转化为pdf(PdfKit)
前言 前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了.但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲... 咋么办的?一个比较好的方法 ...
- 03Del.ashx(删除班级)
03Del.ashx 数据库里定义个BOOL型,TRUE表示正常FALSE表示删除 using System; using System.Collections.Generic; using Syst ...