题意:

  给出一些纪念品的价格,先算出手上的钱最多能买多少种东西k,然后求手上的钱能买k种东西的方案数。也就是你想要买最多种东西,而最多种又有多少种组合可选择。

思路:

  01背包。显然要先算出手上的钱m最多能买多少种东西k,可以从价格最少的纪念品买起,看最多能买多少种,置为k。接下来按照常规01背包计算,需要记录下方案数和组成的物品数,看代码就会懂的。

 #include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=;
int n, m, k, sum;
int p[N],cbn[][N];
int cal()
{
memset(cbn,,sizeof(cbn));
cbn[][]=; //必要的初始化
for(int i=; i<n ;i++) //对于每件物品
{
for(int j=m; j>=p[i]; j--) //对于每种价格
{
for(int e=; e<=n; e++) //组成j价格的方案数是cbn[j]的总和,其中下标e表示由e种纪念品组成的。
cbn[j][e+]+=cbn[j-p[i]][e];
}
}
int cnt=;
for(int i=m; i>=sum; i--) //价格在sum~m,其组合物品数为k的方案数,统计起来就是答案。
cnt+=cbn[i][k];
return cnt;
}
int main()
{
//freopen("input.txt","r",stdin);
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=; i<n; i++) scanf("%d", &p[i] );
sort(p, p+n);
for(sum=k=; k<n; k++)
{
sum+=p[k];
if(sum>m)
{
sum-=p[k]; //这个sum有用的,是买最多件物品的最少价格。
break;
}
} if(k==) //没钱
{
printf("Sorry, you can't buy anything.\n");
continue;
}
printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n", cal(), k );
}
return ;
}

AC代码

hdu 2126 Buy the souvenirs 买纪念品(01背包,略变形)的更多相关文章

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

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

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

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

  3. hdu 2126 Buy the souvenirs(记录总方案数的01背包)

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

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

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

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

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

  6. hdu 1574 RP问题 01背包的变形

    hdu 1574 RP问题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1574 分析:01背包的变形. RP可能为负,所以这里分两种情况处理一下就好 ...

  7. UVA 562 Dividing coins --01背包的变形

    01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostre ...

  8. HDU 1203 I NEED A OFFER!(01 背包DP)

    点我看题目 题意 : 中文题不详述. 思路 :类似于01背包的DP,就是放与不放的问题,不过这个要求概率,至少得到一份offer的反面就是一份也得不到,所以先求一份也得不到的概率,用1减掉就可以得到所 ...

  9. HDU 5887 Herbs Gathering(搜索求01背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=5887 题意: 容量很大的01背包. 思路: 因为这道题目背包容量比较大,所以用dp是行不通的.所以得用搜索来做, ...

随机推荐

  1. day10servlet编程

    Servlet学习的大纲:  . servlet概念及相关接口简介  . servet 执行过程  . servlet路径映射  . 缺省servlet --应用  . servlet生命周 ...

  2. Mysql定时执行任务实现方法

    http://blog.csdn.net/zlp5201/article/details/38309095

  3. John 尼姆博弈

    John Little John is playing very funny game with his younger brother. There is one big box filled wi ...

  4. Java8函数式接口之Predicate<T>

    作用: 这是一个功能接口,因此可以作为lambda表达式或方法引用的赋值目标. 实例: /** * Created by luo on 2017/5/3. */ public class Predic ...

  5. Unity手游之路自动寻路Navmesh之高级主题

    http://blog.csdn.net/janeky/article/details/17492531 之前我们一起学习了如何使用Navmesh组件来实现最基本的角色自动寻路.今天我们再继续深入探索 ...

  6. 洛谷P2867 [USACO06NOV]大广场Big Square

    P2867 [USACO06NOV]大广场Big Square 题目描述 Farmer John's cows have entered into a competition with Farmer ...

  7. layui实现下拉分类多级

    Layui tree 下拉菜单树   1.效果: 2.html  代码: <!DOCTYPE html> <html> <head> <meta charse ...

  8. thinkphp5.1静态文件存放问题

    5.1的版本不能将静态文件放在application目录下,只能放在public目录下,否则会拒绝访问

  9. CC37:穿点最多的直线

    题目 在二维平面上,有一些点,请找出经过点数最多的那条线. 给定一个点集vectorp和点集的大小n,没有两个点的横坐标相等的情况,请返回一个vector,代表经过点数最多的那条直线的斜率和截距. 解 ...

  10. selenium基础操作

    selenium 1.打开和关闭网页 #!/usr/bin/env python # -*- coding:utf-8 -*- from selenium import webdriver drive ...