HDU 2844 Coin 多重背包
Coins
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6279 Accepted Submission(s): 2561
use coins.They have coins of value A1,A2,A3...An Silverland dollar. One
day Hibix opened purse and found there were some coins. He decided to
buy a very nice watch in a nearby shop. He wanted to pay the exact
price(without change) and he known the price would not more than m.But
he didn't know the exact price of the watch.
You are to write a
program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to
the number of Tony's coins of value A1,A2,A3...An then calculate how
many prices(form 1 to m) Tony can pay use these coins.
input contains several test cases. The first line of each test case
contains two integers n(1 ≤ n ≤ 100),m(m ≤ 100000).The second line
contains 2n integers, denoting A1,A2,A3...An,C1,C2,C3...Cn (1 ≤ Ai ≤
100000,1 ≤ Ci ≤ 1000). The last test case is followed by two zeros.
#include<stdio.h>
#include<string.h>
#include<algorithm>
int v[];
int w[];
int dp[];
using namespace std;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==&&m==)
break;
memset(v,,sizeof(v));
memset(w,,sizeof(w));
for(int i=;i<=;i++)
dp[i]=-;
dp[]=;
for(int i=; i<=n; i++)
scanf("%d",&v[i]);
for(int i=; i<=n; i++)
scanf("%d",&w[i]);
for(int i=; i<=n; i++)
{
if(v[i]*w[i]>=m)//完全背包
{
for(int j=v[i]; j<=m; j++)
{
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
}
else
{
for(int k=; k<=w[i]; k=k*)
{
for(int j=m; j>=v[i]*k; j--)
{
dp[j]=max(dp[j],dp[j-v[i]*k]+v[i]*k);
}
w[i]-=k;
}
if(w[i]>)
{
for(int j=m; j>=v[i]*w[i]; j--)
dp[j]=max(dp[j],dp[j-v[i]*w[i]]+v[i]*w[i]);
}
}
}
int count=;
for(int i=; i<=m; i++)
{
if(dp[i]>=)
count++;
}
printf("%d\n",count);
}
return ;
}
AC代码二:
#include<iostream>
#include<string.h>
using namespace std; int a[],c[],F[]; void inline ZeroOnePack(int ResVal,int ResVol,int BpCap)
{
for(int i=BpCap;i>=ResVol;--i)
{
F[i]=max(F[i],F[i-ResVol]+ResVal);
}
} void inline CompletePack(int ResVal,int ResVol,int BpCap)
{
for(int i=ResVol;i<=BpCap;++i)
{
F[i]=max(F[i],F[i-ResVol]+ResVal);
}
} void MultiplePack(int ResVal,int ResVol,int ResNum,int BpCap)
{
if(ResVol*ResNum>=BpCap)
{ CompletePack(ResVal,ResVol,BpCap); }
for(int i=;(<<i)<=ResNum;++i)
{
ZeroOnePack((ResVal<<i),(ResVol<<i),BpCap);
ResNum-=(<<i);
}
if(ResNum) { ZeroOnePack(ResVal*ResNum,ResVol*ResNum,BpCap); }
} int main()
{
int i,j,n,m;
while(cin>>n>>m)
{
if(n+m==)
break;
memset(F,,sizeof(F));
for(i=;i<n;i++)
cin>>a[i];
for(j=;j<n;j++)
cin>>c[j];
for(i=;i<n;i++)
{
MultiplePack(a[i],a[i],c[i],m) ;
}
int num=;
for(i=;i<=m;i++)
{
if(F[i]==i)
num++;
}
cout<<num<<endl;
}
return ;
}
HDU 2844 Coin 多重背包的更多相关文章
- hdu 2844 Coins (多重背包+二进制优化)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:多重背包 , dp[i] ,容量为i的背包最多能凑到多少容量,如果dp[i] = i,那么代表 ...
- HDu -2844 Coins多重背包
这道题是典型的多重背包的题目,也是最基础的多重背包的题目 题目大意:给定n和m, 其中n为有多少中钱币, m为背包的容量,让你求出在1 - m 之间有多少种价钱的组合,由于这道题价值和重量相等,所以就 ...
- HDU - 2844 Coins(多重背包+完全背包)
题意 给n个币的价值和其数量,问能组合成\(1-m\)中多少个不同的值. 分析 对\(c[i]*a[i]>=m\)的币,相当于完全背包:\(c[i]*a[i]<m\)的币则是多重背包,考虑 ...
- HDU 2844 Coins (多重背包计数 空间换时间)
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- 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 ...
- hdu 1963 Investment 多重背包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1963 //多重背包 #include <cstdio> #include <cstr ...
- 杭电1171 Big Event in HDU(母函数+多重背包解法)
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu2844 & poj1742 Coin ---多重背包--两种方法
意甲冠军:你有N种硬币,每个价格值A[i],每个号码C[i],要求. 在不超过M如果是,我们用这些硬币,有多少种付款的情况下,.那是,:1,2,3,4,5,....,M这么多的情况下,,你可以用你的硬 ...
随机推荐
- vim/vi的文件内、跨文件复制粘贴操作、替换操作
vi/vim 中可以使用 :s 命令来替换字符串 1.s/vivian/sky/ 替换当前行第一个 vivian 为 sky 2.:s/vivian/sky/g 替换当前行所有 vivian 为 sk ...
- Single Number and Single Number II
[] Given an array of integers, every element appears twice except for one. Find that single one. [] ...
- 实现SQL Server中的切割字符串SplitString函数
有时我们要用到批量操作时都会对字符串进行拆分,可是SQL Server中却没有自带Split函数,所以要自己来实现了.没什么好说的,需要的朋友直接拿去用吧 SET ANSI_NULLS ON GO S ...
- linux系统安装gcc
安装nginx时会遇到错误提示gcc: command not found,需要先安装gcc 在centos7上安装成功. # yum group list # yum group install & ...
- leetcode mock interview-two sum II
package com.company; import java.util.LinkedList; import java.util.List; public class Main { public ...
- 关于一道面试题,使用C#实现字符串反转算法
关于一道面试题,使用C#实现字符串反转算法. 题目见http://student.csdn.net/space.php?do=question&ac=detail&qid=490 详细 ...
- 如何快速把安卓应用移植到BlackBerry 10上
如何快速把安卓应用移植到BlackBerry 10上 相关博客: BlackBerry相关文档 http://developer.blackberry.com/android/documentatio ...
- go语言基础之break和continue的区别
1.break和continue的区别 在循环里面有两个关键操作break和continue,break操作是跳出当前循环,continue是跳过本次循环. 2.break 备注:break可⽤于fo ...
- 15个重要Python面试题 测测你适不适合做Python?
http://nooverfit.com/wp/15%E4%B8%AA%E9%87%8D%E8%A6%81python%E9%9D%A2%E8%AF%95%E9%A2%98-%E6%B5%8B%E6% ...
- Array.prototype.slice.call 和 slice以及call
单独的简单介绍,后续再补上一些资料. 对象转换为数组. /** * slice : 数组->slice(截取) * 参数有两个,开始截取和结束截取,并返回原数组: * a.slice(1) || ...