COJ 0557 4013多重部分和问题
| 4013多重部分和问题 |
| 难度级别:B; 运行时间限制:2000ms; 运行空间限制:262144KB; 代码长度限制:2000000B |
|
试题描述
|
|
n种大小不同的数字 Ai,每种各Mi个,判断是否可以从这些数字之中选出若干个使他们的和恰好为K。
|
|
输入
|
|
第一行为两个正整数n,K。
第二行为n个数Ai,以空格隔开。 第三行为n个数Mi,以空格隔开。 |
|
输出
|
|
若可行则输出"yes"
否则输出"no" |
|
输入示例
|
|
3 17
3 5 8 3 2 2 |
|
输出示例
|
|
yes
|
|
其他说明
|
|
1<=n<=100
1<=K<=50000 1<=Ai<=40 1<=Mi<=50 若数字相同对程序并无影响。 |
题解:此题有四个层次:
1.枚举bool乱搞:
//标程4
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=+,maxm=+,inf=-1u>>;
bool d[maxn][maxm];int n,tar,A[maxn],num[maxn];
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
while(isdigit(ch)) x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
int len=,buf[];while(x) buf[len++]=x%,x/=;
for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
}
void init(){
memset(d,false,sizeof(d));
n=read();tar=read();
for(int i=;i<n;i++) A[i]=read();
for(int i=;i<n;i++) num[i]=read();
return;
}
void work(){
d[][]=true;
for(int i=;i<n;i++)
for(int j=;j<=tar;j++)
for(int k=;k<=num[i]&&k*A[i]<=j;k++)
d[i+][j]|=d[i][j-k*A[i]];
if(d[n][tar]) puts("yes");
else puts("no");
return;
}
void print(){
return;
}
int main(){
init();work();print();return ;
}
2.快看窝萌还可以滚动,好神奇!
//标程3
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=+,maxm=+,inf=-1u>>;
bool d[][maxm];int n,tar,A[maxn],num[maxn];
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
while(isdigit(ch)) x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
int len=,buf[];while(x) buf[len++]=x%,x/=;
for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
}
void init(){
memset(d,false,sizeof(d));
n=read();tar=read();
for(int i=;i<n;i++) A[i]=read();
for(int i=;i<n;i++) num[i]=read();
return;
}
void work(){
int tc=;d[tc][]=true;
for(int i=;i<n;i++){
tc^=;
for(int j=;j<=tar;j++)
for(int k=;k<=num[i]&&k*A[i]<=j;k++)
d[tc][j]|=d[tc^][j-k*A[i]];
}
if(d[tc][tar]) puts("yes");
else puts("no");
return;
}
void print(){
return;
}
int main(){
init();work();print();return ;
}
3.窝萌还可以搞出正好凑成k的:
//标程2
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=+,maxm=+,inf=-1u>>;
int d[][maxm],n,tar,A[maxn],num[maxn];
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
while(isdigit(ch)) x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
int len=,buf[];while(x) buf[len++]=x%,x/=;
for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
}
void init(){
memset(d,-,sizeof(d));
n=read();tar=read();
for(int i=;i<n;i++) A[i]=read();
for(int i=;i<n;i++) num[i]=read();
return;
}
void work(){
int tc=;d[tc][]=;
for(int i=;i<n;i++){
tc^=;
for(int j=;j<=tar;j++){
if(d[tc^][j]>=) d[tc][j]=num[i];
else if((j>=A[i]&&d[tc][j-A[i]]>=)&&d[tc^][j]) d[tc][j]=d[tc][j-A[i]]-;
else d[tc][j]=-;
}
}
if(d[tc][tar]>=) puts("yes");
else puts("no");
return;
}
void print(){
return;
}
int main(){
init();work();print();return ;
}
4.快看窝萌还可以滚动,好神奇!
//标程1
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=+,maxm=+,inf=-1u>>;
int d[maxm],n,tar,A[maxn],num[maxn];
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
while(isdigit(ch)) x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
int len=,buf[];while(x) buf[len++]=x%,x/=;
for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
}
void init(){
memset(d,-,sizeof(d));
n=read();tar=read();
for(int i=;i<n;i++) A[i]=read();
for(int i=;i<n;i++) num[i]=read();
return;
return;
}
void work(){
d[]=;
for(int i=;i<n;i++){
for(int j=;j<=tar;j++){
if(d[j]>=) d[j]=num[i];
else if((j>=A[i]&&d[j-A[i]]>=)&&d[j]) d[j]=d[j-A[i]]-;
else d[j]=-;
}
}
if(d[tar]>=) puts("yes");
else puts("no");
return;
}
void print(){
return;
}
int main(){
init();work();print();return ;
}
结论:然并卵。
COJ 0557 4013多重部分和问题的更多相关文章
- POJ_1742_Coins_(动态规划,多重部分和)
描述 http://poj.org/problem?id=1742 n种不同面额的硬币 ai ,每种各 mi 个,判断可以从这些数字值中选出若干使它们组成的面额恰好为 k 的 k 的个数. 原型: n ...
- 编程算法 - 多重部分和问题 代码(C)
多重部分和问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n种不同大小的数字a, 每种各m个. 推断能否够从这些数字之中选出若干使它们的 ...
- HDU2844(多重部分和)
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 多重部分和 poj1742
Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...
- 题解报告:hdu 2844 & poj 1742 Coins(多重部分和问题)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- 题解报告:hdu 1059 Dividing(多重背包、多重部分和问题)
Problem Description Marsha and Bill own a collection of marbles. They want to split the collection a ...
- DP的初级问题——01包、最长公共子序列、完全背包、01包value、多重部分和、最长上升子序列、划分数问题、多重集组合数
当初学者最开始学习 dp 的时候往往接触的是一大堆的 背包 dp 问题, 那么我们在这里就不妨讨论一下常见的几种背包的 dp 问题: 初级的时候背包 dp 就完全相当于BFS DFS 进行搜索之后的记 ...
- POJ1742 coins 动态规划之多重部分和问题
原题链接:http://poj.org/problem?id=1742 题目大意:tony现在有n种硬币,第i种硬币的面值为A[i],数量为C[i].现在tony要使用这些硬币去买一块价格不超过m的表 ...
- POJ 1742 Coins ( 经典多重部分和问题 && DP || 多重背包 )
题意 : 有 n 种面额的硬币,给出各种面额硬币的数量和和面额数,求最多能搭配出几种不超过 m 的金额? 分析 : 这题可用多重背包来解,但这里不讨论这种做法. 如果之前有接触过背包DP的可以自然想到 ...
随机推荐
- MVC三层架构编程(Dao、service、servlet 之间的关系)
木哈哈~先开心一会儿,人生的第一篇博客aaa.我一定好好写.不过之前也没怎么看别人写过,还是有点小激动呢,加油.好好总结,会总结的宝宝才会有提高! 今天想总结一下mvc三层架构模型编程,宝宝学习不怎么 ...
- redis 本机链接服务端命令
在windows 本机链接服务端redis,需要下载windows 端的redis: 1,运行redis-server.exe程序:2,打开cmd 控制台3,执行命令 D:\redis64\redis ...
- C# DBNULL与NULL之间的区别【转】
null是.net中无效的对象引用.DBNull是一个类.DBNull.Value是它唯一的实例.它指数据库中数据为空(<NULL>)时,在.net中的值.null表示一个对象的指向无效, ...
- java语言基础特性
使用Java5中的类型安全枚举和注解(以及元注解)编程 http://www.importnew.com/11053.html
- IKAnalyzer原理分析
IKAnalyzer原理分析 IKAnalyzer自带的 void org.wltea.analyzer.dic.Dictionary.disableWords(Collection<Strin ...
- Assembly 'Microsoft.Office.Interop.Excel
编译的时候报错,都无法通过编译: Assembly 'Microsoft.Office.Interop.Excel, Version=14.0.0.0, Culture=neutral, Public ...
- String在JAVA里是固定长度的吗?为什么可用“+”连接
所谓长度固定不是你理解的意思而是说String类中存储的char[]是final的,不能修改,你对String的操作实际上是产生了一个新的String,对于某一个String来说,长度就是固定的了 S ...
- XP系统取消开机硬件检查
非正常关机后进行磁盘检查,主要用于检查磁盘错误等.非法关机后会丢失一些文件或产生一些文件错误,而硬盘自检恰恰就是来检查这些错误并对之进行必要的修复,此功能如果被关闭,不能进行必要的数据恢复,久而久之会 ...
- 【转】深入理解Java内存模型(六)——final
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问.对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象 ...
- 'Invalid update: invalid number of rows in section xx. The number of rows contained in an existing section after the update (xxx)...
'Invalid update: invalid number of rows in section 5. The number of rows contained in an existing s ...