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 邮票面值设计的更多相关文章

  1. 深搜+DP剪枝 codevs 1047 邮票面值设计

    codevs 1047 邮票面值设计 1999年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description ...

  2. [NOIP1999提高] CODEVS 1047 邮票面值设计(dfs+dp)

    dfs出邮票的各种面值,然后dp求解. ------------------------------------------------------------------------------- ...

  3. P1021 邮票面值设计

    P1021 邮票面值设计 题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX ...

  4. P1021 邮票面值设计——搜索+完全背包

    P1021 邮票面值设计 题目意思是你最多用n张邮票,你可以自己设定k种邮票的面值,每种邮票数量无穷,你最多能用这k种邮票在不超过n张的情况下,组合成的价值要求是从1开始连续的, 求最大能连续到多少: ...

  5. P1021 邮票面值设计(dfs+背包dp)

    P1021 邮票面值设计 题目传送门 题意: 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15N+K≤15)种邮票的情况下 (假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大 ...

  6. Java实现 蓝桥杯VIP 算法提高 邮票面值设计

    算法提高 邮票面值设计 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤13)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮 ...

  7. CODEVS1047 邮票面值设计

    题目描述 Description 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之 ...

  8. 1047 邮票面值设计 (DFS+DP)

    题目描述 Description 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之 ...

  9. 洛谷P1021 邮票面值设计

    题目描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤15)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之间的每一个邮资值都能得到 ...

随机推荐

  1. C++常考算法

    1 strcpy, char * strcpy(char* target, char* source){  // 不返回const char*, 因为如果用strlen(strcpy(xx,xxx)) ...

  2. 关于调整TimePicker, DatePicker的大小,样式

    最近在做一个时间选择器,想把要DatePicker和TimePicker放在一起使用,无赖他们的大小样式是被Google写死了,找不到相应的属性来设置,自己花了点时间写了一个使用的Demo,运行的效果 ...

  3. linux 利用nethogs查看某进程的网卡流量

    一.nethogs介绍 分享一个linux 下检测系统进程占用带宽情况的检查.来自github上的开源工具. 它不依赖内核中的模块.当我们的服务器网络异常时,可以通过运行nethogs程序来检测是那个 ...

  4. Node.js的适用场景

    高并发.聊天.实时消息推送.服务器做前端资源压缩

  5. Julia - 算术基本函数

    符号函数和绝对值函数 abs(x) 函数求 x 的绝对值(幅值) julia> abs(3) 3 julia> abs(-3) 3 abs2(x) 函数求 x 的绝对值(幅值)的平方 ju ...

  6. “microsoft ace oledb 12.0 未注册”疑云

    1. 有人说: 2015也是要安装32位的AccessDataengine,anycpu选32位优先才行,不然就是Microsoft.ACE.OLEDB.12.0未注册. hanstom,一个老调重弹 ...

  7. 关于Android的margin(当前视图与周围视图的距离)和padding(当前视图与内部内容的距离)

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  8. application-defined exception

    dataSnap服务器,客户端调用的时候写错了一句话, SQLConnection1->CloneConnection(); 改为 SQLConnection1->Close(); 就好了 ...

  9. Spring Boot启动流程详解

    注:本文转自http://zhaox.github.io/java/2016/03/22/spring-boot-start-flow 环境 本文基于Spring Boot版本1.3.3, 使用了sp ...

  10. 搭建一个Web API项目(DDD)

    传送阵:写在最后 一.创建一个能跑的起来的Web API项目 1.建一个空的 ASP.NET Web应用 (为什么不直接添加一个Web API项目呢,那样会有些多余的内容(如js.css.Areas等 ...