`
leili
  • 浏览: 180356 次
社区版块
存档分类
最新评论

poj 1742 多重背包

    博客分类:
  • DP
DP 
阅读更多

虽然说这题多重背包很明显,但是没有花一点时间是过不了的,TLE 了n次啊,一开始直接用 多重背包 做法直接上,结果T了,后来也看了一些别人的做法,真的是需要思考啊。。

因为这题是判断最后 是否 符合条件,因此没必要 记录 最优结果,因此只要 利用 bool (int就 TLE,各种yy)记录是否 满足条件就可以了。

在 01 背包中,dp[i]=dp[i]|dp[i-cost],表示i的状态要么由 本身 或者  i-cost 推过来,本来是 dp[i]=max(dp[i],dp[i-cost]+weight),但是这边没必要了。。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

const int maxV=100005;
const int maxn=105;
int c[maxn],w[maxn];
int n,V;
bool dp[maxV];

void ZeroOnePack(int cost){
	for(int i=V;i>=cost;i--)dp[i]|=dp[i-cost];
}

void CompletePack(int cost){
	for(int i=cost;i<=V;i++)dp[i]|=dp[i-cost];
}

void MultiplePack(int cost,int amount){
	if(cost*amount>=V)CompletePack(cost);
	else {
		int k=1;
		while(k<amount){
			ZeroOnePack(k*cost);
			amount-=k;
			k<<=1;
		}
		ZeroOnePack(amount*cost);
	}
}

int main(){

	while(scanf("%d%d",&n,&V)&&(n||V)){
			for(int i=1;i<=n;i++)scanf("%d",w+i);
			for(int i=1;i<=n;i++)scanf("%d",c+i);

			//memset(dp,0,sizeof(dp));
			for(int i=0;i<=V;i++)dp[i]=0;
			dp[0]=1;
			for(int i=1;i<=n;i++){
				if(c[i])MultiplePack(w[i],c[i]);
			}
			int ans=0;
			for(int i=1;i<=V;i++)if(dp[i])ans++;
			printf("%d\n",ans);
		}
		return 0;

}



更多详细信息请查看java教程网 http://www.itchm.com/forum-59-1.html
分享到:
评论

相关推荐

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

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

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

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

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

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

    acm新手刷题攻略之poj

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

    poj(百练)题目分类

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

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

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

    acm新手训练方案新手必备

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

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

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

    ACM-PKU-DP.zip_源码

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

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

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

    ACM之路的计划

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

    ACM成长需要做的题目

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

    常用算法 (2).pdf

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

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

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

    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