Buy the souvenirs

Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1662    Accepted Submission(s):
611

Problem Description
When the winter holiday comes, a lot of people will
have a trip. Generally, there are a lot of souvenirs to sell, and sometimes the
travelers will buy some ones with pleasure. Not only can they give the souvenirs
to their friends and families as gifts, but also can the souvenirs leave them
good recollections. All in all, the prices of souvenirs are not very dear, and
the souvenirs are also very lovable and interesting. But the money the people
have is under the control. They can’t buy a lot, but only a few. So after they
admire all the souvenirs, they decide to buy some ones, and they have many
combinations to select, but there are no two ones with the same kind in any
combination. Now there is a blank written by the names and prices of the
souvenirs, as a top coder all around the world, you should calculate how many
selections you have, and any selection owns the most kinds of different
souvenirs. For instance:

And you have only 7
RMB, this time you can select any combination with 3 kinds of souvenirs at most,
so the selections of 3 kinds of souvenirs are ABC (6), ABD (7). But if you have
8 RMB, the selections with the most kinds of souvenirs are ABC (6), ABD (7), ACD
(8), and if you have 10 RMB, there is only one selection with the most kinds of
souvenirs to you: ABCD (10).

 
Input
For the first line, there is a T means the number
cases, then T cases follow.
In each case, in the first line there are two
integer n and m, n is the number of the souvenirs and m is the money you have.
The second line contains n integers; each integer describes a kind of souvenir.

All the numbers and results are in the range of 32-signed integer, and
0<=m<=500, 0<n<=30, t<=500, and the prices are all positive
integers. There is a blank line between two cases.
 
Output
If you can buy some souvenirs, you should print the
result with the same formation as “You have S selection(s) to buy with K kind(s)
of souvenirs”, where the K means the most kinds of souvenirs you can buy, and S
means the numbers of the combinations you can buy with the K kinds of souvenirs
combination. But sometimes you can buy nothing, so you must print the result
“Sorry, you can't buy anything.”
 
Sample Input
2
4 7
1 2 3 4
 
 
4 0
1 2 3 4
 
Sample Output
You have 2 selection(s) to buy with 3 kind(s) of souvenirs.
Sorry, you can't buy anything.
 
Author
wangye
 
Source
 
Recommend
威士忌   |   We have carefully selected several similar
problems for you:  2128 2129 2130 2125 2124 
 
 
记录方案总数的01背包,给dp数组加一维,记录方案总数,记住需要初始化,把所有 dp[i][1] 都设置成1。
 
题意:n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数。加一维表示已经买几件物品。
 
附上代码:
 
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int T,n,m,i,j;
int a[],dp[][];
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=; i<n; i++)
scanf("%d",&a[i]);
memset(dp,,sizeof(dp));
for(i=; i<=m; i++) dp[i][]=; //先全部标记为1,能拿这么多件物品,起码有一种方案
for(i=; i<n; i++)
for(j=m; j>=a[i]; j--)
{
if(dp[j][]==dp[j-a[i]][]+) //如果记录了j元钱拿的物品数量,正好与此时记录的不拿这件物品的最多物品加1相等
dp[j][]=dp[j-a[i]][]+dp[j][];
else if(dp[j][]<dp[j-a[i]][]+) //如果小于,则更新dp
{
dp[j][]=dp[j-a[i]][]+;
dp[j][]=dp[j-a[i]][];
}
}
if(dp[m][]!=)
printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n",dp[m][],dp[m][]);
else
printf("Sorry, you can't buy anything.\n");
}
return ;
}

hdu 2126 Buy the souvenirs(记录总方案数的01背包)的更多相关文章

  1. hdu 2126 Buy the souvenirs 买纪念品(01背包,略变形)

    题意: 给出一些纪念品的价格,先算出手上的钱最多能买多少种东西k,然后求手上的钱能买k种东西的方案数.也就是你想要买最多种东西,而最多种又有多少种组合可选择. 思路: 01背包.显然要先算出手上的钱m ...

  2. hdu 2126 Buy the souvenirs 二维01背包方案总数

    Buy the souvenirs Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. [HDU 2126] Buy the souvenirs (动态规划)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 题意:给你n个物品,m元钱,问你最多能买个多少物品,并且有多少种解决方案. 一开始想到的是,先解 ...

  4. HDU 2126 Buy the souvenirs (01背包,输出方案数)

    题意:给出t组数据 每组数据给出n和m,n代表商品个数,m代表你所拥有的钱,然后给出n个商品的价值 问你所能买到的最大件数,和对应的方案数.思路: 如果将物品的价格看做容量,将它的件数1看做价值的话, ...

  5. hdu 2126 Buy the souvenirs 【输出方案数】【01背包】(经典)

    题目链接:https://vjudge.net/contest/103424#problem/K 转载于:https://blog.csdn.net/acm_davidcn/article/detai ...

  6. hdu2126(求方案数的01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 题意: n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数. 分析:一看 ...

  7. NHibernate使用ICriteria分页并返回数据库记录总条数

    最近在使用NHibernate,发现进行分页查询无法得到数据库记录的总条数,在网上找了很久没找到具体的实现方法,找到的资料都说得不是很清楚,研究了很久终于写出了这样一个方法. NHibernate下分 ...

  8. 筛选BETWEEN '2018-1-1 00:00:00' AND '2018-5-18 00:00:00'每日`status`='1'的记录总条数

    最近做了一个小任务,要求是:使用MySQL #筛选BETWEEN '2018-1-1 00:00:00' AND '2018-5-18 00:00:00'每日`status`='1'的记录总条数 SE ...

  9. PageHelper 记录总条数不正确问题处理

    //PageHelper.startPage会返回一个page对象,这个对象在查询结果出来后会把页数,记录总数给page对象,用page.getPages()和getTotal()获取页数和记录总数. ...

随机推荐

  1. Linux 配置yum源(互联网)

    Linux 配置yum源(互联网) 环境:操作系统Redhat 7.5 1.卸载现有的yum源 rpm -qa|grep yum|xargs rpm -e --nodeps     #移除与原yum有 ...

  2. JS函数式编程 - 概念

    最近在看Typescript,顺便看了一些函数式编程,然后半个国庆假期就没有了.做个笔记,分几个部分写吧. 最开始接触函数式编程的时候,第一个接触的概念就是高阶函数,和柯里化.咋一看,这不就是长期用来 ...

  3. [J2EE规范]JDBC简单例子 标签: 数据库j2eejdbcjava 2017-06-29 10:55 353人阅读 评论(12)

    JDBC是什么? JDBC是java数据库连接(Java Database Connectivity),它是用于java编程语言和数据库之间的数据库无关连接的标准Java API,就是说,JDBC是用 ...

  4. BZOJ 4420二重镇题解

    链接 思路借鉴了这个博客: 我们可以想到状压dp 用一个十进制数来表示状态,即第i位表示位置i处的物品等级 用f[i][j][k]表示第i天,仓库的物品等级为j,状态为k时的最大收益 但是状态数貌似很 ...

  5. 关于PHP学习--摘自知乎

    主要是学框架(其实也没啥可学的).数据库.服务器.linux. 所以我推荐apache/nginx文档,框架的文档,mysql的文档,linux使用说明,等等等等. PHP: PHP 手册MySQL ...

  6. Effective Modern C++:07并发API

    C++11的志伟功勋之一,就是将并发融入了语言和库中,因此在C++的历史上,程序员可以首次跨越所有平台撰写具有标准行为的多线程程序. 35:优先选用基于任务而非基于线程的程序设计 如果需要以异步的方式 ...

  7. 【机器学习PAI实战】—— 玩转人工智能之你最喜欢哪个男生?

    摘要: 分类问题是生活中最常遇到的问题之一.普通人在做出选择之前,可能会犹豫不决,但对机器而言,则是唯一必选的问题.我们可以通过算法生成模型去帮助我们快速的做出选择,而且保证误差最小.充足的样本,合适 ...

  8. scroll 滚动到指定位置触发事件 and 点击一按钮/链接让页面定位在指定的位置

    scroll 滚动到指定位置触发事件:$(function(){ $(window).scroll(function() { var s =$(window).scrollTop(); if (s&g ...

  9. 【JZOJ4894】【NOIP2016提高A组集训第16场11.15】SJR的直线

    题目描述 数据范围 解法 考虑逐次加入每一条直线. 对于当前已加入的直线集合L,现在要新加入一条直线l. 那么它产生的贡献,与平行线有关. 对于任意三条直线,如果其中任意两条平行,那么将不做贡献. 所 ...

  10. Mysql里查询字段为Json格式的数据模糊查询以及分页方法

    public void datagrid(CustomFormEntity customForm,HttpServletRequest request, HttpServletResponse res ...