`
人生难得糊涂
  • 浏览: 118466 次
社区版块
存档分类
最新评论

POJ1276-多重背包

 
阅读更多

说到背包问题,都少不了网上很出名的背包九讲。我也是看了那个以后才知道怎么做的。

多重背包:就是在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;
}

 

0
0
分享到:
评论

相关推荐

    POJ1014-Dividing【DFS】【多重背包+二进制优化】

    在给出的文件列表中,“POJ1014-Dividing【多重背包+二进制优化】.cpp”和“POJ1014-Dividing【DFS】.cpp”很可能是两份不同的C++代码实现,分别展示了如何结合多重背包和二进制优化以及如何利用DFS来解决问题。...

    晒代码之二——多重背包(POJ1276)

    晒代码之二——多重背包(POJ1276)

    acm新手刷题攻略之poj

    - 背包问题分为完全背包、多重背包等多种类型,需要根据不同场景设计不同的策略。 3. **矩阵链乘法** - 推荐题目:[poj2531](https://vjudge.net/problem/POJ-2531)、[poj1416]...

    POJ 3000-3700中的近100题AC代码

    - `3020`:可能涉及到二维或多重状态的动态规划问题,通常用于解决最优化问题,如背包问题、最长公共子序列等。 - `3211`:可能是一个需要用到动态规划来寻找最优解的问题,例如矩阵链乘法、斐波那契数列等。 2. ...

    acm新手训练方案新手必备

    - POJ 1260: 多重背包问题 - POJ 2533: 背包问题的特殊应用 - **编辑距离**:用于计算两个字符串之间的最小编辑距离。 - **示例题目**: - POJ 3176: 编辑距离问题 - POJ 1080: 编辑距离的变种 - POJ 1159: ...

    poj(百练)题目分类

    - 背包问题的各种变体:0/1背包、完全背包、多重背包等。 #### 5. 数据结构题 数据结构题考察的是对各种数据结构的理解和应用能力,如堆、树、图等。 - **知识点**: - 基础数据结构:数组、链表、栈、队列等。 ...

    史上最全poj题目分类(159页).pdf

    而多重背包问题是指有N种物品,每种物品数量有限,目标同样是确定哪些物品装入背包,以使背包中物品的总价值最大。 ### 知识点二:01背包问题 01背包问题可以描述为:给定一个固定大小的背包和一系列具有重量和...

    经典动态规划合集_牛人 树形,压缩 老题

    背包之01背包、完全背包、多重背包详解 Dynamic+Programming 典型的动态规划,用递归下的记忆化搜索来实现 1088 POJ 动态规划加速原理之四边形不等式 基于连通性状态压缩的动态规划问题 对一些DP题目的小结 树型动态...

    DP的单调队列优化-Yuiffy.pdf

    ### DP的单调队列优化详解 ...- 单调队列在多重背包问题中的应用,可以参见“浅谈DP优化之单调队列优化.doc”。 以上内容概述了DP的单调队列优化的基本概念、实现方式及应用场景,希望对学习者有所帮助。

    DP.rar_DP_hdu_动态规划_动态规划 C++

    2. **动态规划分类**:了解常见类型的动态规划问题,如最短路径问题(Floyd-Warshall,Dijkstra,Bellman-Ford等)、背包问题(完全背包,0-1背包,多重背包等)、图论问题(最小生成树,最长路径等)。 3. **C++...

    ACM-PKU-DP.zip_源码

    3. 1157_DP.cpp的源码可能涉及到的问题可能是“背包问题”的变种,比如“完全背包”或“多重背包”问题,或者可能是“最长递减子序列”等。在解决这类问题时,DP通常会结合贪心策略,通过选择具有最大效益的元素来...

    常用算法 (2).pdf

    - **背包问题**:0-1背包、完全背包、多重背包等。 - **字符串算法**:KMP、Trie、后缀树、后缀数组等。 在学习这些算法时,建议通过实际编程练习来加深理解,可以尝试解决POJ等在线编程平台上的题目,如poj3096、...

    ACM成长需要做的题目

    - **策略建议**:0/1背包、完全背包和多重背包是三种主要的背包问题类型。需要掌握它们的解决思路和状态转移方程。 2. **编辑距离**:编辑距离是衡量两个字符串之间差异的一种方法。 - **策略建议**:通过计算两...

    ACM之路的计划

    * 动态规划进阶:完全背包、多重背包等各种背包问题、POJ 上完成一定数目的动态规划题目、状态压缩动态规划、树形动态规划 * 搜索:回溯法熟练应用、复杂的搜索题目练习、双向广度优先搜索、启发式搜索 通过系统化...

    NOIP 数据结构课件

    ### 多重背包问题 **问题描述**:给定一个数组`Pairs`、`Multi`、`Low`、`Up`,需要构造一个数组`Table`,使得`Low[i] [i] [i]`,且满足条件`∑ Multi[i] * Table[i] = 0`,同时使`∑ Pairs[i] * Table[i]`尽可能大...

    kuangbin acm模板超级好用

    2.6 随机素数测试和大数分解 (POJ 1811) . . . . . . . . . . . . . . . . . . . . . . . 29 2.7 欧拉函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.7.1 分解质因素求...

Global site tag (gtag.js) - Google Analytics