code1047 邮票面值设计
dfs+dp
dfs枚举每种情况,每层递归确定第k个数i:i = a[k-1]+1 to a[k-1]*n+1
当枚举完一个序列时,使用check()测试它能达到的max
使用dp。设dp[i]为凑成面值为i的最少张数
for(int k=;a[k]<=i&&k<=t;k++){
if(dp[i-a[k]]<n){
dp[i]=min(dp[i], dp[i-a[k]]+);
}
}
注意dp[i]一开始要设成最大值
代码如下:
#include<iostream>
#include<cstring>
#define Size 41
using namespace std; int a[Size];
int dp[];
int best[Size];
int n,t;//n张 t种
int num=;void save(int x){
num=x;
for(int i=;i<=t;i++){
best[i]=a[i];
}
} int check(){
//memset(dp,0x3f,sizeof(dp));
dp[]=;
int ans=;
bool ok=true; //for(int i=1;i<=t;i++)cout<<a[i]<<" ";
//cout<<endl; for(int i=;ok;i++){
ok=false;
dp[i]=0x3f3f3f3f;
for(int k=;a[k]<=i&&k<=t;k++){
if(dp[i-a[k]]<n){
dp[i]=min(dp[i], dp[i-a[k]]+);
ok=true;
}
}
if(ok)ans=i; //cout<<dp[i]<<' ';
}
//cout<<endl<<endl; return ans;
} void dfs(int k){if(k>t){
int x=check();
if(x>num)save(x);
return;
} for(int i=a[k-]+;i<=n*a[k-]+;i++){
a[k]=i;
dfs(k+);
}
} int main(){
cin>>n>>t; a[]=;
num=; dfs(); for(int i=;i<=t;i++){
cout<<best[i]<<' ';
}
cout<<endl<<"MAX="<<num<<endl;
cout<<f;
return ;
}
By the way:a[1]一定是1!
PS:你可以看到我把check的第一行memset注释掉了,因为大部分时候很长的dp数组后面的很多元素都没有用(max没有那么大),所以只需要在循环里用到一个写一个dp[i]=x03f3f3f3f就可以了。memset使程序变得很慢很慢。(真的很慢啊...)(你真的不需要再试它有多慢了,因为我已经花一个小时帮你试了无数遍了...)
如果想继续优化,可以边dfs边维护dp和当前max2的值,这样dfs循环就可以写成这样:
i = a[k-1]+1 to max2+1
如果i>max2+1,那么max2+1这个数将始终无法凑成,结果不会更优
code1047 邮票面值设计的更多相关文章
- 深搜+DP剪枝 codevs 1047 邮票面值设计
codevs 1047 邮票面值设计 1999年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description ...
- [NOIP1999提高] CODEVS 1047 邮票面值设计(dfs+dp)
dfs出邮票的各种面值,然后dp求解. ------------------------------------------------------------------------------- ...
- P1021 邮票面值设计
P1021 邮票面值设计 题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX ...
- P1021 邮票面值设计——搜索+完全背包
P1021 邮票面值设计 题目意思是你最多用n张邮票,你可以自己设定k种邮票的面值,每种邮票数量无穷,你最多能用这k种邮票在不超过n张的情况下,组合成的价值要求是从1开始连续的, 求最大能连续到多少: ...
- P1021 邮票面值设计(dfs+背包dp)
P1021 邮票面值设计 题目传送门 题意: 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15N+K≤15)种邮票的情况下 (假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大 ...
- Java实现 蓝桥杯VIP 算法提高 邮票面值设计
算法提高 邮票面值设计 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤13)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮 ...
- CODEVS1047 邮票面值设计
题目描述 Description 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之 ...
- 1047 邮票面值设计 (DFS+DP)
题目描述 Description 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之 ...
- 洛谷P1021 邮票面值设计
题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之间的每一个邮资值都能得到 ...
随机推荐
- windows + python3.5.2 + anaconda3 + dlib 安装配置
首先下载boost库,根据提示:1)运行 bootstrap.bat. 生成三个文件,其中包括b2 -- bootstrap.bat2)运行b2 -- b2 install3) 利用b ...
- GOF23设计模式之迭代器模式(iterator)
一.迭代器模式概述 提供一种可以遍历聚合对象的方式.又称为:游标(cursor)模式 结构: (1)聚合对象:存储数据 (2)迭代器:遍历数据 二.迭代器模式示例代码 定义:正向遍历迭代器和逆向遍历迭 ...
- python 高阶内置函数
1.lambda 匿名函数 lambda 参数: 返回值 函数名统一都叫lambda. 2.sorted() 排序函数 排序函数 sorted(iterable,key,reverse) key:排序 ...
- NGUI中LabelA停靠LabelB的方法
详情看 http://note.youdao.com/noteshare?id=ec901d56341207052b2d19233b5ddba3 这里仅仅贴出文字,完整内容请看上面链接. 有这样一个需 ...
- python的可变数据类型和不可变类型
python里面一切皆对象 ython的每个对象都分为可变类型和不可变类型 整形,浮点型,字符串,元组属于不可变类型,列表,字典是可变类型 不可变数据类型 对不可变类型的变量重新赋值,实际上是重新创建 ...
- 电话号码以185****3547显示demo
String phone="18678473547"; //String phones = phone.substring(0,phone.length()-(phone.subs ...
- 线程之死锁、递归锁、信号量、事件Event 、定时器
1.死锁的现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相 ...
- wget 技巧
最近用到一个命令wget,有一个技巧分享一下. [root@py ~]# wget -m -k http://www.example.com 可以将示例网站整个打包,作为本地镜像.
- ceph集群jewel版本 rbd 块map 报错-故障排查
测试信息如下: [root@ceph_1 ~]# ceph osd pool lsrbdchy_123swimmingpool #新建rbd 块: rbd create swimmingpool/ba ...
- 第六篇 Flask 中内置的 Session
Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...