0-1背包再修改版

题目描述

把钱花完了,所以单身了,单身了所以过双“11”,过双“11”所以把钱花完了。

今年Nova君(三号)照旧过着他暗无天日的“买买买”的双“11”,然而因为囊中羞涩,并不能够太任性。他的购物车中,列满了数不清的商品,共有N件,好多商品居然还不止一件 __(:3 」∠)_ 现在Nova君要做出一个艰难的抉择,他要从所有商品中挑出m件拼成一个订单,请问有多少种凑单的方法呢?求访法数对M的余数。

PS:同一种商品不作区分。

输入

多组测试数据(不超过100组)

每组数据两行,第一行为三个正整数N,m,M,具体意义详见描述,第二行为N个正整数a1,a2,,,an,代表第i个商品的个数

(1<=N,ai,m<=1000,2<=M<=10000)

输出

对于每组数据,输出一行,表示方法总数

输入样例

3 3 10000
1 2 3

输出样例

6

题目来源:http://biancheng.love/contest/17/problem/G/index详情见代码以及注释:
 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4 const int N=1010;
 5 int a[N];
 6 int b[N][N];
 7 int main()
 8 {
 9     int n,m,M;
10     while(scanf("%d%d%d",&n,&m,&M)==3)
11     {
12         for(int i = 0; i < n; i++)
13             scanf("%d",&a[i]);//每种商品的件数
14
15         for(int i = 0; i <= n; i++)
16             b[i][0] = 1;
17
18         for(int i = 0; i < n; i++)//n种商品
19             for(int j = 1; j <= m; j++)//挑出m件
20             {
21                 if(j -1 - a[i] >= 0)//是否大于第i中商品件数
22                     b[i+1][j] = (b[i][j] + b[i+1][j-1] - b[i][j-1-a[i]] +M)%M;
23                 else
24                     b[i+1][j] = (b[i][j] + b[i+1][j-1])%M;
25             }
26         printf("%d\n",b[n][m]);
27     }
28
29 }
另附背包的一些模板函数:
 1 void ZoreOnePack(int cost , int weight)//0-1背包
 2 {
 3     for (int i = W ; i >= weight ; -- i)
 4         f[i] = max(f[i],f[i-weight]+cost) ;
 5 }
 6
 7 void CompletePack(int cost , int weight)//完全背包
 8 {
 9     for (int i = weight ; i <= W ; ++ i)
10         f[i] = max(f[i],f[i-weight]+cost) ;
11 }
12
13 void MultiPack(int cost , int weight , int num)//多重背包
14 {
15     if (num*weight>=W)
16         CompletePack(cost,weight) ;
17     else
18     {
19         int k = 1 ;
20         while (k<num)
21         {
22             ZoreOnePack(cost*k,weight*k) ;
23             num -= k ;
24             k += k ;
25         }
26         ZoreOnePack(cost*num,weight*num) ;
27     }
28 }
29
30 void TwoZoreOnePack(int cost , int weight , int many)
31 {
32     for (int i = W ; i >= weight ; -- i)
33         for (int j = M ; j >= many ; -- j)
34             two[i][j] = max(two[i][j],two[i-weight][j-many]+cost) ;
35 }
36
37 void TwoCompletePack(int cost ,int weight ,int many)
38 {
39     for (int i = weight ; i <= W ; ++ i)
40         for (int j = many ; j <= W ; ++ j)
41             two[i][j] = max(two[i][j],two[i-weight][j-many]+cost) ;
42 }
43
44 void TwoMultiPack(int cost ,int weight , int many , int num)
45 {
46     if (num*weight>=W&&num*many>=M)
47         TwoCompletePack(cost,weight,many) ;
48     else
49     {
50         int k = 1 ;
51         while (k<num)
52         {
53             TwoZoreOnePack(cost*k,weight*k,many*k) ;
54             num -= k ;
55             k += k ;
56         }
57         TwoZoreOnePack(cost*num,weight*num,many*num) ;
58     }
59 }


 
时间: 2024-10-13 23:28:10

0-1背包再修改版的相关文章

SevenZip.pas BUG修改版

本来用的是Henri Gourvest <[email protected]> 1.2版本 然后发现了2个问题: 1.对于文件名中带有空格的文件, 无法压缩, 原因是1488行, 压缩调用的是TStringList.Delimiter 来拆分文件字符串, 而空格是默认分行符, 导致文件名错误 2.解压缩函数, 如果目标文件已存在并且为只读属性时, 报错, 原因是1105行 创建文件流的时候直接使用了TFileStream.Create(path, fmCreate)导致 针对以上2个问题, 对

VB程序逆向反汇编常见的函数(修改版)

VB程序逆向常用的函数 1) 数据类型转换: a) __vbaI2Str    将一个字符串转为8 位(1个字节)的数值形式(范围在 0 至 255 之间) 或2 个字节的数值形式(范围在 -32,768 到 32,767 之间). b)__vbaI4Str   将一个字符串转为长整型(4个字节)的数值形式(范围从-2,147,483,6482,147,483,647) c)__vbar4Str  将一个字符串转为单精度单精度浮点型(4个字节)的数值形式 d)__vbar8Str   将一个字符

Android 仿美团网,大众点评购买框悬浮效果之修改版

我之前写了一篇关于美团网,大众点评的购买框效果的文章Android对ScrollView滚动监听,实现美团.大众点评的购买悬浮效果,我自己感觉效果并不是很好,如果快速滑动界面,显示悬浮框的时候会出现一卡的现象,有些朋友说有时候会出现两个布局的情况,特别是对ScrollView滚动的Y值得监听,我还使用了Handler来获取,还有朋友给我介绍了Scrolling Tricks这个东西,我下载试了下,确实美团网,大众点评的购买框用的是这种效果,但是Scrolling Tricks只能在API11以上

jsorder 第三方修改版 修正bug 增加总价

我主要运用这个jsorder,修正了它的不足//1.0版本bug:刷新页面 无法增加或者删除原来添加的商品//1.1版本:修正了1.0版本  新增bug 能够修改原来的商品 但出现产品数量为0 仍然保留在购物车中.//1.2版本:修正了1.1版本的产品为0 并且增加了购物车总价原文:代码一共6k,基于jquery的购物车实现,实现订单的本地cookie存储,支持购物车自定义样式,金额的计算.通过json与后台交互.实现可配置化的购物车系统,可应用于电子商务平台. ?1. [代码]使用代码    

机器学习基石笔记3——在何时可以使用机器学习(3)(修改版)

转载请注明出处:http://www.cnblogs.com/ymingjingr/p/4271742.html 目录 机器学习基石笔记1——在何时可以使用机器学习(1) 机器学习基石笔记2——在何时可以使用机器学习(2) 机器学习基石笔记3——在何时可以使用机器学习(3)(修改版) 机器学习基石笔记4——在何时可以使用机器学习(4) 机器学习基石笔记5——为什么机器可以学习(1) 机器学习基石笔记6——为什么机器可以学习(2) 机器学习基石笔记7——为什么机器可以学习(3) 机器学习基石笔记8

sqm(sqlmapGUI) pcat修改版

sqlmap是一款开源的注入工具,支持几乎所有的数据库,支持get/post/cookie注入,支持错误回显注入/盲注,还有其他多种注入方法. 支持代理,指纹识别技术判断数据库 .而sqm(sqlmapGUI)是一个图形界面,在上面可以快速地组装参数,构造sqlmap命令语句,来调用sqlmap来执行. sqm的原作者我不了解,而汉化者是ettack,这工具在2012年左右比较流行,这几天我才了解,想在网上找一个下载也麻烦,原本的网址大多失效,最后还得在csdn花10积分下载的,安装运行后觉得还

浙大PAT CCCC L3-001 凑零钱 ( 0/1背包 &amp;&amp; 路径记录 )

题目链接 分析 : 就是一个 0/1 背包,但是需要记录具体状态的转移情况 这个可以想象成一个状态转移图,然后实际就是记录路径 将状态看成点然后转移看成边,最后输出字典序最小的路径 这里有一个很巧妙的做法 先将所有的硬币升序排序(这一点很重要) 然后在这一条件下,假设当前状态是考虑第 i 个硬币,前一个状态是考虑第 i-1 个硬币 试想对于同一个体积,如果选用的硬币数量越多是不是字典序更小 然后对于如果对于同一体积下,选用硬币数一样多的两种方案 由于我们已经升序排序,如果有一样多硬币的情况,那么

安装阿里云github提供的修改版minikube

由于kubenetes域名背墙(gcr.io),如kubernetes-dashboard服务依赖不能正常使用. $ docker pull gcr.io/google_containers/pause-amd64:3.0 Error response from daemon: Get https://gcr.io/v1/_ping: http: error connecting to proxy http://localhost:1087: dial tcp 127.0.0.1:1087: g

poj1417 带权并查集+0/1背包

题意:有一个岛上住着一些神和魔,并且已知神和魔的数量,现在已知神总是说真话,魔总是说假话,有 n 个询问,问某个神或魔(身份未知),问题是问某个是神还是魔,根据他们的回答,问是否能够确定哪些是神哪些是魔. 对于这些问题,我们只需要发现,如果回答对方是魔,那么即可以判断出这两个不是同一种族,而如果回答对方是神,那么说明这两个是同一种族,那么就可以用带权并查集合并这些神和魔,然后记录两种分别多少个,这样当所有询问都处理完时我们就可以得到一系列的集合,每个集合分别有它的两个种族的人数,但是此时对于每个