说到背包问题,都少不了网上很出名的背包九讲。我也是看了那个以后才知道怎么做的。
多重背包:就是在0 1背包的基础上,有的物品可能有多个,问你怎么选才能使总价值最大。
我们最容易想到的是把相同的物品分开,比如说有n个a1物品 就将它分成 a1 a2 a3 ...an 然后再用01背包的方法去解决。不过在此题中,重复的物品可能有很多个,所以这样会超时。
在背包九讲中提出了一种方法:若某物品n[i]个 ,那么我们得到一串系数1 2 4 ...2 ^(k-1) ,n[i]-2^k+1 其中k为满足n[i]-2^k+1>0的最大整数,比如13拆成1 2 4 6 ,将这种物品分成4个物品,每个物品的价值和重量均在原基础上分别乘以得到的系数。
这种分解方法比原来的方法有很大的改进
下面是代码
#include<iostream> using namespace std; #define MAXSIZE 100010 #define MAX(a,b) (a>b?a:b) int cash,n; int tn; int num[1010]; int d[1010]; int w[10010]; int dp2[MAXSIZE]; //背包九讲 int getpow(int p) { if(!p) return 1; int at=1; while(p--) at=at<<1; return at; } int getk(int ni) { int k=0; int old=0; while(ni+1>getpow(k)) { old=k; k++; } return old; } void fenjie() { tn=1; memset(w,0,sizeof(w)); memset(dp2,0,sizeof(dp2)); for(int i=1;i<=n;i++) { int tt=num[i]; //得到最大系数k int k=getk(num[i]); //分解 int rate; for(int j=0;j<k;j++)//0->(k-1) { rate=getpow(j); w[tn++]=rate*d[i]; } rate=num[i]-getpow(k)+1; w[tn++]=rate*d[i]; } } int slove() { tn--; //多重背包问题 for(int i=tn;i>=1;i--) { for(int j=cash;j>=1;j--) { if(w[i]<=j)//放的下 { dp2[j]=MAX(dp2[j],dp2[j-w[i]]+w[i]); } } } return dp2[cash]; } int main() { while(scanf("%d",&cash)!=EOF) { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&num[i],&d[i]); } //拆开 fenjie(); //背包 printf("%d\n",slove()); } return 0; }
相关推荐
在给出的文件列表中,“POJ1014-Dividing【多重背包+二进制优化】.cpp”和“POJ1014-Dividing【DFS】.cpp”很可能是两份不同的C++代码实现,分别展示了如何结合多重背包和二进制优化以及如何利用DFS来解决问题。...
晒代码之二——多重背包(POJ1276)
- 背包问题分为完全背包、多重背包等多种类型,需要根据不同场景设计不同的策略。 3. **矩阵链乘法** - 推荐题目:[poj2531](https://vjudge.net/problem/POJ-2531)、[poj1416]...
- `3020`:可能涉及到二维或多重状态的动态规划问题,通常用于解决最优化问题,如背包问题、最长公共子序列等。 - `3211`:可能是一个需要用到动态规划来寻找最优解的问题,例如矩阵链乘法、斐波那契数列等。 2. ...
- POJ 1260: 多重背包问题 - POJ 2533: 背包问题的特殊应用 - **编辑距离**:用于计算两个字符串之间的最小编辑距离。 - **示例题目**: - POJ 3176: 编辑距离问题 - POJ 1080: 编辑距离的变种 - POJ 1159: ...
- 背包问题的各种变体:0/1背包、完全背包、多重背包等。 #### 5. 数据结构题 数据结构题考察的是对各种数据结构的理解和应用能力,如堆、树、图等。 - **知识点**: - 基础数据结构:数组、链表、栈、队列等。 ...
而多重背包问题是指有N种物品,每种物品数量有限,目标同样是确定哪些物品装入背包,以使背包中物品的总价值最大。 ### 知识点二:01背包问题 01背包问题可以描述为:给定一个固定大小的背包和一系列具有重量和...
背包之01背包、完全背包、多重背包详解 Dynamic+Programming 典型的动态规划,用递归下的记忆化搜索来实现 1088 POJ 动态规划加速原理之四边形不等式 基于连通性状态压缩的动态规划问题 对一些DP题目的小结 树型动态...
### DP的单调队列优化详解 ...- 单调队列在多重背包问题中的应用,可以参见“浅谈DP优化之单调队列优化.doc”。 以上内容概述了DP的单调队列优化的基本概念、实现方式及应用场景,希望对学习者有所帮助。
2. **动态规划分类**:了解常见类型的动态规划问题,如最短路径问题(Floyd-Warshall,Dijkstra,Bellman-Ford等)、背包问题(完全背包,0-1背包,多重背包等)、图论问题(最小生成树,最长路径等)。 3. **C++...
3. 1157_DP.cpp的源码可能涉及到的问题可能是“背包问题”的变种,比如“完全背包”或“多重背包”问题,或者可能是“最长递减子序列”等。在解决这类问题时,DP通常会结合贪心策略,通过选择具有最大效益的元素来...
- **背包问题**:0-1背包、完全背包、多重背包等。 - **字符串算法**:KMP、Trie、后缀树、后缀数组等。 在学习这些算法时,建议通过实际编程练习来加深理解,可以尝试解决POJ等在线编程平台上的题目,如poj3096、...
- **策略建议**:0/1背包、完全背包和多重背包是三种主要的背包问题类型。需要掌握它们的解决思路和状态转移方程。 2. **编辑距离**:编辑距离是衡量两个字符串之间差异的一种方法。 - **策略建议**:通过计算两...
* 动态规划进阶:完全背包、多重背包等各种背包问题、POJ 上完成一定数目的动态规划题目、状态压缩动态规划、树形动态规划 * 搜索:回溯法熟练应用、复杂的搜索题目练习、双向广度优先搜索、启发式搜索 通过系统化...
### 多重背包问题 **问题描述**:给定一个数组`Pairs`、`Multi`、`Low`、`Up`,需要构造一个数组`Table`,使得`Low[i] [i] [i]`,且满足条件`∑ Multi[i] * Table[i] = 0`,同时使`∑ Pairs[i] * Table[i]`尽可能大...
2.6 随机素数测试和大数分解 (POJ 1811) . . . . . . . . . . . . . . . . . . . . . . . 29 2.7 欧拉函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.7.1 分解质因素求...