poj1742Coins(多重背包)
People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony opened his money-box 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
The 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.
Output
For each test case output the answer on a single line.
Sample Input
3 10
1 2 4 2 1 1
2 5
1 4 2 1
0 0
Sample Output
8
4
做这个题时,第一次这么写的:
#include<iostream>
#include<cstdio>
using namespace std;
bool dp[100][100001];
int n,m,a[100],su[100];
int main(){
while(cin>>n>>m){
if(n==0&&m==0) return 0;
for(int i=0;i<n;i++)
for(int j=1;j<=m;j++)
dp[i][j]=false;
for(int i=0;i<n;i++)
scanf("%d",&a[i]),dp[i][0]=true; //dp[i][j]为真,表示j元可以凑出来 ,a[i]硬币的面额
for(int i=0;i<n;i++)
scanf("%d",&su[i]); //su[i]表示面额为a[i]的硬币的数量
for(int i=1;i<=su[0]&&a[0]*i<=m;i++) //注意a[0]*i<=m,or就会出现runtime error
dp[0][a[0]*i]=true;
for(int i=1;i<n;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=su[i];k++){
if(j-k*a[i]>=0&&dp[i-1][j-k*a[i]]) dp[i][j]=true;
else dp[i][j]=dp[i-1][j];
}
}
}
int s=0;
for(int i=1;i<=m;i++){
if(dp[n-1][i]) /*printf("%d ",i),*/s++;
}
printf("%d\n",s);
}
}
这么写的话会超时,虽然这个dp好理解,但是这个dp的复杂度为O(m(su[i]的和))
现在附上第二次AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[2][100005];
int main(){
int n,m,va[102],su[102];
while(cin>>n>>m){
if(n==0&&m==0) return 0;
memset(dp,-1,sizeof(dp));
for(int i=0;i<n;i++)
scanf("%d",&va[i]); //硬币的面额
for(int i=0;i<n;i++)
scanf("%d",&su[i]); //面额为va[i]的硬币的数量
for(int i=0;i<=su[0]&&va[0]*i<=m;i++)
dp[0][va[0]*i]=su[0]-i;
for(int i=1;i<n;i++){
for(int j=0;j<=m;j++){
if(dp[(i-1)%2][j]>=0) dp[i%2][j]=su[i];
else if(j<va[i]||dp[i%2][j-va[i]]<=0) dp[i%2][j]=-1;
else dp[i%2][j]=dp[i%2][j-va[i]]-1;
}
}
int s=0;
for(int i=1;i<=m;i++)
if(dp[(n-1)%2][i]>=0) /*printf("%d ",i),*/s++;
printf("%d\n",s);
}
}
这个复杂度为O(nm),
dp[i][j]表示前i+1中硬币加和得到j元钱时,第i+1种硬币剩余的数量。

poj1742Coins(多重背包)的更多相关文章
- POJ1742Coins(多重背包)
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 32309 Accepted: 10986 Descripti ...
- 洛谷P1782 旅行商的背包[多重背包]
题目描述 小S坚信任何问题都可以在多项式时间内解决,于是他准备亲自去当一回旅行商.在出发之前,他购进了一些物品.这些物品共有n种,第i种体积为Vi,价值为Wi,共有Di件.他的背包体积是C.怎样装才能 ...
- HDU 2082 找单词 (多重背包)
题意:假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26.那么,对于给定的字母,可以找到多少价值<=50的 ...
- Poj 1276 Cash Machine 多重背包
Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26172 Accepted: 9238 Des ...
- poj 1276 Cash Machine(多重背包)
Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33444 Accepted: 12106 De ...
- (混合背包 多重背包+完全背包)The Fewest Coins (poj 3260)
http://poj.org/problem?id=3260 Description Farmer John has gone to town to buy some farm supplies. ...
- (多重背包+记录路径)Charlie's Change (poj 1787)
http://poj.org/problem?id=1787 描述 Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie dri ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- POJ1742 Coins[多重背包可行性]
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 34814 Accepted: 11828 Descripti ...
- POJ1276Cash Machine[多重背包可行性]
Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32971 Accepted: 11950 De ...
随机推荐
- vs2015上编译QT程序的环境搭建
下载相对应版本的QT(以QT5.7.0为例),进入网站http://download.qt.io/archive/qt/5.7/5.7.0/,下载MSVC版本QT,我的系统是64位,VS版本是2015 ...
- 什么是http协议??
一.http协议的定义: http(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本.图片.视频等)传输的规定.也就是说,htt ...
- 总结const、readonly、static三者的区别【收藏、转载】20190614
总结const.readonly.static三者的区别 const:静态常量,也称编译时常量(compile-time constants),属于类型级,通过类名直接访问,被所有对象共享! a.叫编 ...
- C# 模拟页面登录
using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...
- AD转换为KiCAD的方法
一.Altium文件转KiCad文件 本文主要介绍: 1.AD文件(SCH和PCB)转换为KiCAD的方法 2.AD封装库转换为KiCAD库的方法 下面让我们进入正题 1.1 PCB的第一种转换方式 ...
- arm算力
arm 算力运算 MIPS: Million Instructions executed Per SecondDMIPS: Dhrystone Million Instructions execute ...
- [BZOJ] 书堆
问题描述 蚂蚁是勤劳的动物,他们喜欢挑战极限?现在他们迎来了一个难题!蚂蚁居住在图书馆里,图书馆里有大量的书籍.书是形状大小质量都一样的矩形.蚂蚁要把这些书摆在水平桌子的边緣.蚂蚁喜欢整洁的布置,所以 ...
- OSS重磅推出OSS Select——使用SQL选取文件的内容
对象存储OSS(Object Storage Service)具有海量.可靠.安全.高性能.低成本的特点.OSS提供标准.低频.归档类型,覆盖多种数据从热到冷的存储需求,单个文件的大小从1字节到48. ...
- vscode中执行gulp task的简便方法
本文重点是gulp在vscode中执行task任务的方法 如何像webstorm那样简便操作gulp 的task 第1步:安装node.下载地址:https://nodejs.org/zh-cn/ 检 ...
- C++ 得到系统时间
Time::Time() {//得到系统时间 初始化 time_t t; t=time(NULL); tm *lt; lt=localtime(&t); hour=lt->tm_hour ...