博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva--165(邮资问题,dp)
阅读量:4311 次
发布时间:2019-06-06

本文共 1344 字,大约阅读时间需要 4 分钟。

题意:

某国家发行k种不同面值的邮票,而且规定每张信封上最多仅仅能贴h张邮票。

公式n(h,k)表示用从k中面值的邮票中选择h张邮票,能够组成面额为连续的1。2。3,……n。 n是能达到的最大面值之和。

快被坑死了。回溯法是能够的,能够利用回溯法推断能拼出的数值,可是利用动态规划的思想能够提高效率,dp[i]表示拼出i须要的最少数量邮票,tmp数组一開始定义成全局了,无限TLE,貌似由于出不了wa就超时了…………

代码:

#include
#include
#include
#include
#include
#include
#include
#define INF 0X3f3f3f3f#define mem(a,b) memset(a,b,sizeof(a))using namespace std;typedef long long ll;typedef unsigned long long llu;const int maxd=1000+50;int stamp[15] ,maxval[15],ans[15],dp[maxd];int h,k;void solve(int cur){ if(cur==k) { if(maxval[k-1]>ans[k]) { memcpy(ans,stamp,sizeof(stamp)); ans[k]=maxval[k-1]; } return; } int tmp[maxd]; memcpy(tmp,dp,sizeof(dp)); for(int i=stamp[cur-1]+1; i<=maxval[cur-1]+1; ++i) { stamp[cur]=i; for(int j=1; j<=stamp[cur]*h; ++j) { for(int k=1; k<=h; ++k) { int num=k*stamp[cur]; if(j>=num && dp[j-num]>=0) { if(dp[j]<0 && dp[j-num]+k<=h) dp[j]=dp[j-num]+k; else if(dp[j-num]+k
0) ++cnt; maxval[cur]=cnt-1; } solve(cur+1); memcpy(dp,tmp,sizeof(tmp)); }}int main(){ freopen("1.txt","r",stdin); while(scanf("%d%d",&h,&k)==2 && (h+k)) { ans[k]=0; stamp[0]=1,maxval[0]=h; mem(dp,-1); for(int i=0; i<=h; ++i) dp[i]=i; solve(1); for(int i=0; i
%3d\n",ans[k]); } return 0;}

转载于:https://www.cnblogs.com/mengfanrong/p/5105636.html

你可能感兴趣的文章
python机器学习-sklearn挖掘乳腺癌细胞(二)
查看>>
javascript中的函数节流和函数去抖
查看>>
异步函数的串行执行和并行执行
查看>>
Import Solution Error code :0x80048426
查看>>
Spring的注解@Qualifier小结
查看>>
目前最新版本ActiveMQ 5.15.3 和JDK版本有关的问题
查看>>
hdu 4513 吉哥系列故事——完美队形II
查看>>
ECSHOP让产品浏览历史按照先后进行排序
查看>>
解决小程序中 cover-view无法盖住canvas的问题,仅安卓真机出现
查看>>
C# 获取数组的内存地址
查看>>
职场规则五
查看>>
跟我一起学WCF(1)——MSMQ消息队列
查看>>
京东联盟采集规则
查看>>
hdu-1143(简单dp)
查看>>
字典树
查看>>
ControlExtensionTest(二)-----CCControlSlider
查看>>
CentOS 开发环境准备
查看>>
正则表达式在.net中的应用—新手工作笔记
查看>>
5-2 彩色图片直方图
查看>>
02_servlet介绍
查看>>