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

POJ3624-01背包问题

阅读更多

该题就是原版的01背包问题,没有任何改变,唯一需要注意的是需要用到滚动数组,(因为开不了那么大的二维数组),做完这个后在discuss中看到有人贴出的代码只需要一个数组就可以完成,很是有趣,学习了

先贴我自己写的滚动数组的代码

 

 

#include<iostream>
using namespace std;
#define len 3500 
#define maxw 14000
int max(int a,int b)
{
	return a>b?a:b;
}
int main()
{
	int n,tot,i,j,w[len],d[len];
	int dp1[maxw];
	int dp2[maxw];
	scanf("%d",&n);
	scanf("%d",&tot);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&w[i]);
		scanf("%d",&d[i]);
	}
	for(j=1;j<=tot;j++)//初始化最后一个物品的dp数组  
	{
		if(w[n]<=j)
			dp1[j]=d[n];
		else
			dp1[j]=0;
	}
	for(i=n-1;i>=1;i--)//从最后一个物品开始往前放
	{
		dp1[0]=0;
		for(j=1;j<=tot;j++)
		{

			if(w[i]>j)//如果已经放不下了
				dp2[j]=dp1[j];
			else
			{
				dp2[j]=max(dp1[j],dp1[j-w[i]]+d[i]);//如果还可以放,
								//则选择放或者不放
			}
			
		}
		for(j=1;j<=tot;j++)
			dp1[j]=dp2[j];//两个数组循环使用 
	}
	printf("%d\n",dp1[tot]);
	return 0;
}

 

 

以下是只用一个数组的版本,

#include<iostream>
using namespace std;
int max(int a,int b)
{
	return a>b?a:b;
}
int main()
{
	int n,m,i,j,*dp,*w,*d;
	scanf("%d %d",&n,&m);//n表示有几个物品,m表示背包容量
	dp=new int[m+2];
	w=new int[n+1];
	d=new int[n+1];
	for (i=1;i<=n;i++)
	{
		scanf("%d %d",&w[i],&d[i]);
	}
	for (i=0;i<=m;i++)
	{
		dp[i]=0;
	}
	for (i=1;i<=n;i++)
	{
		for (j=m;j>=w[i];j--)//j从大往小遍历,这样j前面的数据就没有被覆盖
					//所以只用一个数组即可
		{
			dp[j]=max(dp[j],dp[j-w[i]]+d[i]);
		}
	}
	printf("%d\n",dp[m]);
	return 0;
}

 

 

0
0
分享到:
评论

相关推荐

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

    北大POJ1014-Dividing【DFS】【多重背包+二进制优化】 解题报告+AC代码

    01背包问题

    动态规划 01背包问题 POJ3624可以AC

    poj.grids.cn题型分类

    带上下界限制的背包问题(012背包) 3.线性的动态规划问题 积木游戏问题 决斗(判定性问题) 圆的最大多边形问题 统计单词个数问题 棋盘分割 日程安排问题 最小逼近问题(求出两数之比最接近某数/两数之和等于...

    POJ2773_采药_背包_动态规划

    经典的0-1背包问题. 适合新手学习. 原题网址:http://poj.grids.cn/problem?id=2773

    POJ 1015 动态规划

    POJ上的一道题目,自己写的代码,因为想下载别人的, 所以就放上了。

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

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

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

    01背包问题 acm动态规划总结 PKU——DP专辑 背包之01 POJ 动态规划总结 背包之01背包、完全背包、多重背包详解 Dynamic+Programming 典型的动态规划,用递归下的记忆化搜索来实现 1088 POJ 动态规划加速原理之四边形...

    LeetCode判断字符串是否循环-Leetcode:刷!

    背包问题 动态规划 POJ 3267 POJ 1260 POJ 1015 POJ 3176 POJ 1080 POJ 1159 POJ 2533 POJ 1836 Leetcode 70 Leetcode 309 搜索 DFS POJ 2488 POJ 3083 POJ 3009 POJ 1321 BFS POJ 3278 POJ 1426 POJ 3126 POJ 3414 ...

    leetcode中国-MyAlgorithmSolutions::balloon:记录我所有的算法/数据结构

    leetcode中国 MyAlgorithmSolutions ...背包问题 区间DP 区间问题 绝对值不等式 DP课 寒假每日一题 基础班 提高班 POJ 大二 2019 新生赛 蓝桥杯模拟 蓝桥杯学习 bfs 大数 dfs/抽象dfs 逻辑 测试 栈/递归 清华oj入门

    acm_problems:刷题!!!

    #POJ 题集 数论 欧几里得/拓展欧几里得算法 1006 1061 搜索 普通搜索 1062, 1088, 2386 剪枝优化 1011 动态规划 背包 1014 高精度 加减乘除 1001 巧妙处理 思维处理 1852 模拟 1017 简单题 水题 1004 1007 1008 枚举...

    kuangbin acm模板超级好用

    2.10.1 一类开关问题,对 2 取模的 01 方程组 . . . . . . . . . . . . . . . . . . . 37 2.10.2 解同余方程组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 2.11 整数拆分 . . . . . . ....

Global site tag (gtag.js) - Google Analytics