这道题的DP非常的有意思……

一开始我们总是会以为这是一个背包问题,直接dp[0] = 0,dp[j] += dp[j-c[i]]进行转移。之后统计一下从dp[m-minn]~dp[m]的答案之和为结果。

其中minn指花费最小的那个物品的花费。
不过这样是会丢解的。因为统计的过程我们只统计了不选最小的时候的情况,我们其实完全没有考虑到,选择了比一个物件花费小的所有物件却没有选择这个物件的情况。也就是说,上面的做法其实是相当于强制性不取最小的+全取的情况之和。

那么我们就应该选择强制性不取第2,3,……n个,然后保证前面比它们小的每一个都被选取,而更大的就直接背包dp,最后统计一下选不到当前这个物品共有多少种情况。也就是先从小到大排个序,之后依次处理就可以了。

啊啊啊怎么也想不到真是弱死了orz

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
#include<cstring>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')using namespace std;
typedef long long ll;
const int M = 1005;
const int mod = 1e7+7;int read()
{int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') op = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ans *= 10;ans += ch - '0';ch = getchar();}return ans * op;
}int m,n,c[M],dp[M],minn = 2147483647,ans;int main()
{
//    freopen("gift.in","r",stdin);
//    freopen("gift.out","w",stdout);n = read(),m = read();rep(i,1,n) c[i] = read();sort(c+1,c+1+n);rep(k,0,n){m -= c[k];if(m < 0) break;if(m == 0 || m < c[k+1] || k == n)     {ans++;break;}memset(dp,0,sizeof(dp));dp[0] = 1;rep(i,k+2,n)per(j,m,c[i]) dp[j] += dp[j-c[i]],dp[j] %= mod;rep(j,m-c[k+1]+1,m) ans += dp[j],ans %= mod;}printf("%d\n",ans);return 0;
}
/*
6 25
8 9 8 7 16 5
30 250
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
*/

转载于:https://www.cnblogs.com/captain1/p/9607323.html

礼物gift(DP)相关推荐

  1. cdoj 1131 男神的礼物 区间dp

    男神的礼物 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1131 Descr ...

  2. P7276-送给好友的礼物【dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P7276?contestId=39577 题目大意 nnn个点的一棵树,kkk个关键点,两个人从根出发分别走一段路径 ...

  3. 省选专练川渝友谊考试S10礼物gift

    门边少女 WBQ 想要给她的男朋友买礼物. 礼物有 n 种,每种礼物有一个价格 ai ,如果 WBQ 买了礼物 i,那么她需要付出 ai 的代价. 同时,还有 m 对关系 (pi, qi, bi) , ...

  4. QQ每天定时领取群礼物

    本脚本采用Go语言进行编写,主要原因是简单粗暴,几行代码就搞定了,后面部署也非常方便 目录结构 1. 代码编写 package mainimport ("encoding/json" ...

  5. 庆祝六一儿童节:Python实现的随机礼物分配器

    这是一个简单的Python程序,这个程序将为每个儿童分配一个礼物. import random# 儿童名字列表 children_names = ['小明', '小红', '小华', '小李', '小 ...

  6. 题目推荐—BZOJ 水题推荐

    [bzoj1756]Vijos1083小白逛公园 裸题- -..线段树维护lmax,rmax,max,sum然后搞之.. [Ahoi2008]Meet 紧急集合 求两两点的lca然后会发现必然有两个l ...

  7. python装饰器学习

    装饰器 要学会装饰器,必须首先知道什么是闭包. 闭包: 在函数中提出的概念 就是内层函数对外层函数(非全局变量的运用)并且返回值是内部函数的引用. 格式: - def 外部函数:def内部函数:ret ...

  8. go string 转 uint64_小改动,大提升:最近 Go 标准库的一次优化

    点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 本文作者:鸟窝 smallnest,原文有视频讲解 原文链接:https://colobu.com/2 ...

  9. 直播 | LiveVideoStack Meet杭州:后直播时代技术

    2016年被称为直播元年,来到2017年,许多直播App面临着并购和转型,如直播与短视频和游戏或将更多的结合.在这样的背景下,直播技术还会有哪些突破呢?比如,在特定场景下的连麦与多人共享白板技术,读写 ...

最新文章

  1. “饶毅举报”事件尘埃落定,裴钢表示未发现裴钢造假。网友:我有信心一年发20篇SCI...
  2. 相对熵/KL散度(Kullback–Leibler divergence,KLD)
  3. sql server数据库定时自动备份
  4. Mac安装和启动memcached
  5. 【深度学习】L1、L2损失 和 L1、L2正则化
  6. 推荐系统的十个关键点
  7. 402. 移掉K位数字(单调栈)
  8. htt://3g.hn_根据我对“询问HN:谁在招聘?”的分析,开发人员技能发展趋势
  9. OpenTSDB 开发指南之 Grafana 展示OpenTSDB监控数据
  10. python系列(四)python元组与字典
  11. 蓝桥杯 基础练习 特殊的数字
  12. 在pytorch中expand_dim
  13. 单元测试的必要性 从bug修复 费用成本和时间成本综合考虑
  14. 一些模板(按字典序排序)
  15. 大数据查询怎么优化?
  16. 计算机课题推荐人意见,课题推荐人意见
  17. ONIE——开放网络安装环境
  18. 网络爬虫——票房网数据抓取及存储
  19. linux tts 中文,基于linux的中文TTS 简单实现
  20. Leetcode 300-最长递增子序列

热门文章

  1. 【OpenCV】OpenCV实战从入门到精通之 -- 基本图像绘制
  2. 700 页的机器学习笔记火啦,图文生动形象
  3. 综述 | Google团队发布,一文概览Transformer模型的17大高效变种
  4. 应用重连时间_App Store 无法正常下载应用,一直转圈的处理办法
  5. 向程序发送命令失败_java程序员进阶:Redis分布式技术问题集锦
  6. 基于Tkinter和百度Aip的人体关键点检测
  7. React Native (一) react-native-video实现音乐播放器和进度条的功能
  8. springboot(十二)-分布式锁(redis)
  9. [转帖]win10 .Net Runtime Optimization Service占用大量CPU资源解决方法
  10. TensorFlow——实现线性回归算法