【日常刷题】邮票面值设计(搜索与动态规划)

邮票面值设计

对于这一道题目,我们可以采取搜索的手段去枚举每一张邮票,再用动态规划求得最大的连续数值。其中的难点就是如何进行枚举,至于动态规划则仅仅是完全背包的一个简单变形。

搜索:让我们最后输出的总数中要求从小到大按照次序输入,那么我们从小到大枚举即可。我们可以知道,数字1是必须要去的,不然就无法枚举到了数字1;接着,我们就要去枚举了。我们使用递归的参数来记录取的个数take,最大连续和MAX,总和sum。那么新取的数的范围就必然在temp[take]+1~MAX+1(temp记录取的数字)之间,做区间是为了保证有序性,右区间则保证了不会超过MAX+1,不然就无法枚举到这个MAX+1这个值了。枚举完之后,我们就考虑如何得到这个连续值。

DP动态规划:完全背包的简单变形。设f[i]为组成数字i的最小邮票数. f [ j ] = m i n ( f [ j ] , f [ j − t e m p [ i ] ] + 1 ) f[j]=min(f[j],f[j-temp[i]]+1) f[j]=min(f[j],f[jtemp[i]]+1)即数字为j的,取了数字temp[i]就在原来的基础上面+1的情况。但是需要注意,枚举数字的最大范围是sum×n,表示每一件物品都取上限n个。最后的取值最大连续的数字答案ans的表达式为: a

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DESCRIPTION: 1.Analyze Problem A : sorted stamps array A={ai} ai: one stamp element in array n: array size, that is number of elements in array r: desired value of stamps F(n,r):expected result, minimum number of stamps for a given value r from n size array. S: selected stamps array S={si} 2.Choose Algorithm a.Greedy algorithm seems to be a good choice, try to solve it in O(n), i try divide array into subarry B={bi}, r should larger than every elemnt in B that is r>bi and suppose bk is the smallest element in B, so that r= bk%r, f(i,r)=(bk/r), F(n,r)=∑f(i,r). The main idea is to choose the last element who larger than desired value each time. However,it can not give us optimal solution in some condition, like A={8,5,4,1}, if r=10, this algoritm will give a solution F(n,r)=3, S={8,1,1},but the optimal solution should be F(n,r)=2, S={5,5}. b.Full search so the straight forwards algorithm is to search for every solution in A for desired value directly.However, it will always take O(n!) to go through every combination. c.Dynamic programming, at last, I decide to choose dynamic programming. analyze optimal structure, suppose in A={ai}, for a specific stamp ak,there will be two cases it is choosen so that f(i,r)=1+f(i,r-ak) , 1<=i<=k, r>=ak it is not valid so that f(i,r)=f(i-1,r) 3.Design Dynamic programming optimal structure: Compute-opt(r)= 1 + Compute-opt(r-ai) value: Compute-opt(r) = ∞ (r < 0) Compute-opt(r) = 0 (r = 0) Compute-opt(r) = 1+{Compute-opt(r-ai)} ( 1=<i<=n, r>ai>0 ) Complexity :O(nr) Memory cost:O(n+r) Compute in a bottom-up style to recursive every desired value and array. store value of Compute-opt in memory for future use, so that we can easily get value from those memory in future recursive call, and avoid compute again, that is if the array is not change, you can easily fetch result any desired value j (j < r, r is the value using for compute ). 2.For User totally, I design a small command line for this machine list below 1.Manual Operation 2.Self Auto Testing 3.Check Results q.Quit Manual Operation: when select this machine will turn to be manual mode, ask person to input stamps and desired value; Self Auto Testing:when select this machine will turn to be auto mode, show the test case already design in code after that machine will quit automatically. Check Results: only be visiable in Manual Operation, people can check desired value for the array input before, the desired value should be no more than first time input. Quit, clean all the memory and quit system.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值