Gift
【问题描述】
人生赢家老王在网上认识了一个妹纸,然后妹纸的生日到了,为了表示自己的心
意,他决定送她礼物。可是她喜爱的东西特别多,然而他的钱数有限,因此他想
知道当他花一定钱数后剩余钱数无法再购买任何一件剩余物品(每种物品他最多
买一个)时有多少种方案,两种方案不同,当且仅当两种方案中至少有一件品不
同,可是由于他忙着准备泡下一个妹纸(chi),因此麻烦聪明的你帮帮忙。
【输入格式】
输入第一行 n 和 m,n 表示妹纸喜欢的礼物数目,m 表示现有的钱数,第二行 n
个数,表示 n 个物品的价格。
【输出格式】
输出一行一个数表示方案数目,答案对 1000000007 取模。
【样例输入 1】
gift.in
6 25
8 9 8 7 16 5
【样例输出 1】
gift.out
15
【数据范围】
30%的数据: 0<=n<=100 0<=m<=500
100% 的数据:0<=n<=1000 0<=m<=1000
注意:所有物品价格均小于 m
【题解】
算法:动态规划
30%的数据:爆搜+剪枝或DP,DP是三维的…..
100%的数据:从大到小排一遍序,枚举取到了第i个物品f[j]表示这时剩余j元的方案数.
取第i个物品:f[j]+=f[j-a[i]],若i取的话,i+1…n一定要被取到,那么剩余的钱在<=m-a[i+1] ,>m-a[i]的范围内时就可以更新答案.
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int N=1005,mod=1000000007;
bool vis[N];
int a[N],v[N][N],w[N];
il int gi()
{
re int x=0;
re short int t=1;
re char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
int main()
{
freopen("gift.in","r",stdin);
freopen("gift.out","w",stdout);
int n,m,ans=0;
n=gi();m=gi();
fp(i,1,n) a[i]=gi();
sort(a+1,a+1+n);
fp(i,1,n) w[i]=w[i-1]+a[i];
fp(i,1,n)
{
fp(k,0,a[i])
{
if(vis[k]==0) continue;
fq(j,m,a[i])
{
v[j][k]+=v[j-a[i]][k];
v[j][k]%=mod;
}
}
if(w[i-1]<=m) v[w[i-1]][a[i]]++,vis[a[i]]=1;
}
fp(i,0,m)
fp(j,0,m)
if(m-i<j) ans=(ans+v[i][j])%mod;
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
return 0;
}
Gift的更多相关文章
- USACO . Greedy Gift Givers
Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts ...
- CF# Educational Codeforces Round 3 B. The Best Gift
B. The Best Gift time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 快来玩“Gift大转盘”百分百赚好礼
现在开始到今年的最后一天,你天天都可以来转100%中奖的“ Gift大转盘 ”.代金券.产品折扣.精美纪念礼,没有多余规则.全部网友都可参加,转到就是你赚到,赶快转起来吧! >>活动主页& ...
- Gift Hunting(分组背包)
Gift Hunting Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- Codeforces Educational Codeforces Round 3 B. The Best Gift 水题
B. The Best Gift 题目连接: http://www.codeforces.com/contest/609/problem/B Description Emily's birthday ...
- 1002 GTY's birthday gift
GTY's birthday gift Time Limit ...
- [light oj 1328] A Gift from the Setter
1328 - A Gift from the Setter Problem setting is somewhat of a cruel task of throwing something at ...
- 119 - Greedy Gift Givers
Greedy Gift Givers The Problem This problem involves determining, for a group of gift-giving frien ...
- HDU 5171 GTY's birthday gift 矩阵快速幂
GTY's birthday gift Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- USACO Section 1.1-2 Greedy Gift Givers
Greedy Gift Givers 贪婪的送礼者 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少. 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那 ...
随机推荐
- Eclipse报错:Setting property 'source' to 'org.eclipse.jst.jee.server:xx' did not find a matching property
Shell代码 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to ' ...
- <MyBatis>入门七 缓存机制
缓存机制 MyBatis包含强大的查询缓存特性,它可以非常方便的定制和配置.缓存可以极大的提升查询效率. MyBatis默认定义了两级缓存:一级缓存和二级缓存 1.默认情况下,只有一级缓存(sqlSe ...
- springboot的jsp热部署
使用springboot每次修改jsp都需要重新启动是不是很麻烦呢?以下是解决办法! yml格式 server: servlet: jsp: init-parameters: development: ...
- 每日命令:(1)ls
ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看linu ...
- codeforces 689 Mike and Shortcuts(最短路)
codeforces 689 Mike and Shortcuts(最短路) 原题 任意两点的距离是序号差,那么相邻点之间建边即可,同时加上题目提供的边 跑一遍dijkstra可得1点到每个点的最短路 ...
- BNUOJ 2528 Mayor's posters
Mayor's posters Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Origin ...
- HDU——1133 Buy the Ticket
Buy the Ticket Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- Problem 2669
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- [bzoj 1059][ZJOI 2007]矩阵游戏(二分图最大匹配)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 分析:不论如何交换,同一行或同一列的点还是同一行或同一列,如果我们称最后可以排成题目要求 ...
- 学习——Git及VersionControl
一.Git基本介绍 1.Git是什么? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.用以有效.高速的处理从很小到非常大的项目版本管理.Git 是 Linus To ...