每周学习总结

2021-5-15
每周学习总结(这周主要是写两周以来背包dp的题,二分的话下周。题目难度中等,只是细节太多了。😐)
1,hdu 2546
题意,有许多物品,每件物品都有自己的价格。饭卡中有钱,当钱小于等于5元时,可以随便买一个没有买过的物品,饭卡中的钱可以为负数,求饭卡中钱数的最小值。
总结,本题较简单,主要是一下几个细节一直无法AC。1注意这题是判断问题,可能有人会想前j个物品选k个花费m是否能达到。如果按照这种方法是绝对正确的,但是如果这样那么dp就必须是二维数组而且是三重循环,我花了一段时间写了出来,发现😑超时了2,当用剩余钱数减去物品的钱数时,一定看是否结果是小于零的,如果小于零直接和min1比较就可以了。不小于零才可以放到数组中。3,题目给数据时,是随便给的,但是处理时可以将物品价格排序,最后一个是最后买的。以后dp题,一定注意购买顺序。

2,hdu 2955
题意,小偷想要抢钱并且不想被抓住,有多个银行可以选择,每个银行都有自己的价值和小偷被抓住的概率,问给定一个概率成为最大概率,即超过这个概率就会被抓,问在小于这个最大概率的前提下获得钱数的最大值。

错误思路,开始时会将概率乘100然后计算在概率为i时候能够取得的最大价值是多少。说明该方法错误理由有二1,题目中没说概率一定两位小数,2,即便是用浮点数map<double.int>来求解也不知道每次该加上多少。所以无法使用当下标为概率时所获得的最大值是多少。

正确思路,当获得价值为为i时,不被抓住的概率。

细节,1,因为只有被抓住的概率,所以数组中保存的应该是不被住的概率(1-p)*(1-b),而如果求被抓住的概率的话就是三种情况的相加,在第一的银行被抓了,没被第二个抓,第二个被抓了没有被第一个抓,二个都被抓了,如此计算量就加大了。3,不要想当然的认为是概率为两位小数,虽然样例中给出的数据是两位。
总结,1,这题较为新颖的地方在于,将通常会放在数组中的值价值改为了下标,具有独特的理解方式,这也给我们提供了新的解题思路。2,将小于被抓住改为了大于不被抓住,大大简化了运算,提高了精度。

3,hdu 3466
题意,给定有待出售几个物品和你所拥有的钱数,每个物品都有自己的价格,价值和最小购买价格(最小购买价格是指如果所剩钱数小于该最小购买价格将无法购买该物品,显然最小购买价格一定是大于等于),要求算出能获得最大价值是多少
错误思路,1,不排序直接计算,只是在内层循环中将从v到了该物品的最小购买价格而已2,排序了,但是是按照最小购买价格排序的,认为先考虑购买那些限制高的,等剩余钱数小的时候,在考虑限制低的。原因1,第一种思路考虑到了限制条件,但是没有考虑购买顺序对总价值的影响。2,第二种思路只考虑限制条件,忽视了价格和购买限制之间的联系。

正确思路,如果剩余的钱数大于q1+q2那1,2和剩余钱数既小于q1也小于q2那这两种情况都是1,2谁在前谁在后都是无所谓的。我们要考虑的情况是如果没有构建排序那么只能买1,2中的一个,但是排序后1,2都可以买,这样价值较大。首先如果先买1而且还能买2那么要求在买1之前剩余的钱数是p1+q1同理先买2需要的钱数p2+q1,那么可以看出如果排序的话是p1+q1<p2+q1。

总结,这题困难在排序的方式十分难想。考虑到限制条件的使用。如果两个都买那最后肯定花费p1+p2问题在于考虑花费的顺序。
4,uva 147
题目,给定许多种类的钞票,每一种钞票的面额不同,每种钞票的数量不做限制,要求给定一个金额,求出能够组成该金额的方案数。

错误思路,第一重循环从1开始到指定金额结束,第二重循环从面额最小到最大,然后每次dp【i1】+=dp【i1-i2】。
这种思路错误在了可能会出现重复的情况。比如在20的时候如果写出所有方案数会发现出现了一次5和15组合和一次15和5组合,但是这是同一种情况,所以该方法不行。

正确思路,将面额设为一重循环,然后金额设为二重循环从1到最大。可以看出这种循环不会出现重复的情况。
总结,这题的思路巧妙的将面额的种类看做一般背包问题中的种类,将面额看坐了重量。通过后面循环的数一定比前面循环的数大,来避免重复。

🤔背包dp格式较为简单,但是灵活多变,有时还和高精度,贪心结合,这时候就要十分注意题目中给的限制条件,尤其是内存,数值大小和时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序员学习笔记app是一款为程序员打造的学习工具,旨在帮助他们提高学习效率、管理学习内容,并激发学习动力。 首先,该app提供了丰富的学习资源和教程。程序员可以在app中浏览各种编程语言、框架和工具的教程,学习专业知识和技能。这些教程不仅简明易懂,还包含大量的实例和代码,程序员可以通过实践巩固学习成果。 其次,该app具有个性化学习管理功能。程序员可以根据自己的学习目标和阶段,设置学习计划和提醒。例如,可以设定每天学习一定时间,或者每周学习特定主题。同时,app还提供了笔记功能,方便程序员记录学习心得、难点和解决方案。这些笔记可以随时查看和编辑,帮助程序员进行复习和总结。 另外,该app还提供了学习进度统计和反馈。程序员可以查看自己的学习时间、完成的教程和理解程度等信息,了解自己的学习情况和进步。同时,app还会根据学习情况给出相应的建议和鼓励,让程序员感到自己的努力得到了认可和支持。 最后,该app还具有社交化功能。程序员可以在app上与其他学习者交流、分享学习心得和经验。他们可以发布问题并得到他人的解答和帮助,同时也能从他人的经验中获得启发和提升。这种社区交流的环境可以激发程序员的学习热情和团队合作精神。 总之,程序员学习笔记app通过提供学习资源、个性化管理、学习反馈和社交交流等功能,有效地帮助程序员提高学习效率和成果。这样的学习工具将成为程序员们的得力助手,助推他们在编程领域的进步和发展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值