/*有n件物品,旅客一共有m块大洋。第一个问题,旅客最多可以买多少件物品?请注意,这里是多少件,不是价值最大。所以这个非常好求,将所有的物品按照价值排序,先买便宜的,再买贵的。贪心的思想。这个地方有些细节需要处理,如果所有物品的价值总和比旅客的钱少,那么就只有一个方案,旅客可以买走所有的物品。如果旅客的钱数连第一件物品都买不起,那么就直接输出”Sorry,you

 can't buy anything.“。

用这种方法,我们可以求出旅客最多买多少件物品,求出之后,物品的价格就有了两种属性,一种是钱数,一种是件数。也就是买一件物品需要的消耗是它的价格的钱数和1件物品的份额。在背包九讲中,这个叫做二维费用的背包问题。

如果是求最优方案,这个问题依旧毫无压力。但是现在的问题是求方案总数。

我们用dp[j][k]表示花费j元买k件物品的方案数,实际上很容易我们就可以得到dp[j][k]=dp[j][k]+dp[j-a[i]][k-1]。关于这个方程有两个需要特别解释的地方,第一个这个是空间优化后的方程,优化后的原理参见背包九讲第一讲01背包,这里不再叙述。我们需要知道的是dp[j][k]在这里指的是dp[i-1][j][k],也就是在考虑过第i-1件物品后dp[j][k]的方案数。这个解释了这个dp[j][k]为什么可以直接继承过来。第二个需要解释的是,在dp[j][k]和dp[j-a[i]][k-1]中有没有相同的方案,即我们有没有冒着重复计算的风险将两者相加。答案是没有。因为在dp[j-a[i]][k-1]这些方案中都有第i件物品,我们说过dp[j][k]实际上是dp[i-1][j][k],其中根本没有第i件物品的影子,所以两者不可能有重复的方案。*/

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

int cmp(const void *a,const void  *b ) {

return *(int *)a-*(int *)b;

}

int dp[600][40];

int a[40];

int main() {

int t,n,m,i,j,p,kind;

scanf("%d",&t);

while(t--) {

memset(dp,0,sizeof(dp));

scanf("%d%d",&n,&m);

for(i=0;i<n;i++)

scanf("%d",&a[i]);

qsort(a,n,sizeof(a[0]),cmp);

        p=m;

for(i=0;i<n;i++) {

if(p-a[i]>=0)

                p-=a[i];

else

break;

}

kind=i;

if(kind==0) {

printf("Sorry, you can't buy anything.\n");

continue;

}

for(i=0;i<=m;i++)

dp[i][0]=1;

for(i=0;i<n;i++)

for(j=m;j>=a[i];j--)

for(int k=kind;k>=1;k--)

dp[j][k]=dp[j][k]+dp[j-a[i]][k-1];//dp[j-a[i]][k-1]包含第i种物品,dp[J][K]相当于dp[i-1][j[k]。每次考虑第i种物品来选方案数

printf("You have %d selection(s) to buy with %d kind(s) of souvenirs.\n",dp[m][kind],kind);

}

return 0;

}

hdu 2126背包问题的更多相关文章

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

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

  2. (01背包)Buy the souvenirs (hdu 2126)

    http://acm.hdu.edu.cn/showproblem.php?pid=2126 Buy the souvenirs Time Limit: 10000/1000 MS (Java/Oth ...

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

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

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

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

  5. HDU 2126 01背包(求方案数)

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

  6. HDU 1203 背包问题

    题目大意: 根据学校的申请费用,根据已有的钱得到最大的offer率 这里很明显就是一个价值为概率的背包问题 计算两个offer合并的概率 为a + b - a*b #include <cstdi ...

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

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

  8. HDU 2126 (背包方法数) Buy the souvenirs

    DP还有很长很长一段路要走.. 题意:给出n纪念品的价格和钱数m,问最多能买多少件纪念品和买这些数量的纪念品的方案数. 首先,求能买最多的纪念品的数量,用贪心法可以解决.将价钱排序,然后从最便宜的开始 ...

  9. hdu 2126

    背包,输出方案数! #include<cstdio> #include<cstring> #include<algorithm> #define maxn 505 ...

随机推荐

  1. qconbeijing2017

    http://2017.qconbeijing.com/schedule 第一天 (2017年4月16日/星期日)   签到 专题 主题演讲 快速进化的容器生态 微服务与 DevOps 最佳实践(厂商 ...

  2. EmitMapper系列之二:EmitMapper的使用小结

    EmitMapper的入门 EmitMapper引用 EmitMapper案例 最近公司开发项目前端使用一个js框架,后端使用ef,js前台读取的json采用实体的dto来进行生成. 在网上看到了Em ...

  3. python的与或非运算

    真的很重要,栽了个跟头!!!(虽然以前好像知道...) print(True or False and False) print((True or False) and False) # True # ...

  4. mongodb的安装及配置安装服务

    1. 安装mongodb数据库 mongodb官方网址:https://www.mongodb.org 安装好之后的步奏: 第一步:规划你的安装目录和数据库文件的存储路径,我打算将Mongo的程序文件 ...

  5. express搭建平台

    1.nodeJs的安装(npm的安装) nodejs官方下载地址:https://nodejs.org 2.express的安装( $ npm install -g express #全局安装expr ...

  6. Runtime理解

    动态语言 OC是一门不折不扣的动态语言,所以它的很多机制都是动态运行时决定的.这点和C语言不一样,C语言是静态绑定,也就是编译后所有的一切都已经决定了.这一点和C语言的函数指针有些类似,很多时候函数指 ...

  7. iOS开发-Runtime详解

    iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...

  8. IOS中经典的缓存对比

    http://bpoplauschi.wordpress.com/2014/03/21/ios-image-caching-sdwebimage-vs-fastimage/

  9. xorequation(DFS完全枚举)

    题目 有一个含有N个未知数的方程如下: x1^x2^...^xn= V,给定N,V,再给定正整数a1,a2,...an满足1≤ai≤9且∏Ni=1(ai+1)  ≤ 32768,请输出所有满足0≤xi ...

  10. react开启一个项目 webpack版本出错

    npx create-react-app my-app cd my-app npm start 在命令行里执行以上语句就可(前两天刚刚发现,最新版的react对webpack的版本要了新要求,大概是他 ...