`

背包问题之poj3211

 
阅读更多

题意:有m (1~10)种不同颜色的衣服总共n (1~100)件,Dearboy和她的girlfriend两个人要一起洗完全部衣服,为了预防色彩混合,他们不能同时洗不同颜色的衣服,给出洗完每件衣服所需的时间cloth[i].tim和它的颜色cloth[i].col,求出Dearboy和她的girlfriend最少用多少时间能洗完全部衣服。

 

思路:01背包,由于各种颜色互相独立,故把每种颜色都化为一个01背包,求出洗完每种颜色衣服的最短时间,它们的总和即为答案。首先按颜色对衣服进行归类,即将相同颜色的衣服放在同一类中
对于某一种颜色的所有衣服所需要的最少时间,相当于将这堆衣服按时间分为两推,使得这两堆衣服所需要的时间尽可能的接近。对于每堆衣服建模:  假设当前这堆衣服一个人洗的时间为sum, mid = sum/2;
  
问题转化为,(1)有背包容量为mid,现在要从这堆衣服中选取衣服,使得总容量尽可能接近于mid
  
继续转化..2)背包容量为mid,某件衣服的重量为wi,价值也为wi,计算所能达到的最大价值 dp[mid],
  
那么问题(2)中的dp[mid]相当于问题(1)中最接近于mid的那个容量,故原问题中这堆衣服所需要的实际时间为sum - dp[mid];

代码如下:

#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
const int M=10;
const int N=100;
char color[M][N];
vector<int>cost[M];
int dp[100002];

int Max(int a,int b)
{
	return a>b?a:b;
}

int main()
{
	int n,m;
	while (scanf("%d%d",&m,&n)!=EOF)
	{
		if(m==0&&n==0)
			break;
		int i,j;
		for (i=0;i<m;i++)
		{
			cin>>color[i];
			cost[i].clear();
		}
		while (n--)
		{
			char col[N];
			int time;
			cin>>time>>col;
			for (i=0;i<m;i++)
				if(strcmp(color[i],col)==0)
					break;
				if(i<m)
				{
					cost[i].push_back(time);
				}
		}
		int ans=0;
		for (i=0;i<m;i++)
		{
			memset(dp,0,sizeof(dp));
			int sz=cost[i].size();
			int k,mid,sum=0;
			for (j=0;j<sz;j++)
				sum+=cost[i][j];
			mid=sum/2;
			for (j=0;j<sz;j++)
			{
				for (k=mid;k>=cost[i][j];k--)
				{
					dp[k]=Max(dp[k],dp[k-cost[i][j]]+cost[i][j]);
				}
			}
			ans=ans+sum-dp[mid];
		}
		cout<<ans<<endl;
	}
	return 0;
}

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

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

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

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

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

    POJ算法题目分类

    * 背包问题:背包问题是指解决问题的背包问题算法,如 poj1837、poj1276。 * 型如下表的简单 DP:型如下表的简单 DP 是指解决问题的简单 DP 算法,如 poj3267、poj1836、poj1260、poj2533。 * 计算几何学:计算几何...

    POJ 1015 动态规划

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

    acm新手刷题攻略之poj

    ### ACM新手刷题攻略之POJ 在ACM竞赛领域,特别是对于初学者而言,选择合适的平台进行训练至关重要。POJ(Peking University Online Judge)作为国内最早且最知名的在线评测系统之一,拥有丰富的题库资源,对于提高...

    poj题目分类

    * 背包问题:例如 poj1837、poj1276。 * 类型 DP:例如 poj3267、poj1836、poj1260、poj2533。 中级 1. 基本算法: * C++的标准模版库的应用:例如 poj3096、poj3007。 * 较为复杂的模拟题的训练:例如 poj...

    poj各种分类

    例如,poj1328和poj2109就是典型的贪心问题。贪心算法的关键在于正确性证明,确保每一步的局部最优能够导向全局最优。 #### 分治法与递归 分治法是将大问题分解成若干个子问题,递归地求解这些子问题,然后将子问题...

    poj训练计划.doc

    - 背包问题:如`poj1837, poj1276`。 - 简单DP:如`poj3267, poj1836`。 - **数学** - 组合数学:如`POJ3252, poj1850`。 - 数论:如`poj2635, poj3292`。 #### 第二阶段中级训练计划 #### 第3周至第4周(共...

    01背包问题

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

    acm训练计划(poj的题)

    - (poj3267, poj1836, poj1260, poj2533):零一背包、完全背包等问题的解决方案。 3. **二维动态规划**: - (poj3176, poj1080, poj1159):多维状态转移方程的应用。 ### 五、组合数学 1. **排列组合基础**: ...

    POJ题目简单分类(ACM)

    - **背包问题**:如poj1837,解决有限资源下的最优化问题。 - **表格型DP**:如poj3267,通过状态转移矩阵求解问题。 6. **数学**: - **组合数学**:包括计数原理、排列组合以及递推关系,如poj3252。 - **...

    强大的poj分类

    - POJ 1130 - The Sultan's Successors(背包问题变体) **相关知识点**: - 状态定义与转移方程的建立 - 多维DP与一维DP的转换技巧 - DP算法的时间复杂度分析 - 背包问题的不同类型及其解法 #### 四、总结 通过...

    POJ题目及答案

    动态规划则常用于解决背包问题、最长公共子序列等复杂问题;贪心算法常常用于解决最优调度、最小花费等问题;排序算法如快速排序、归并排序等也是常考内容;搜索算法如深度优先搜索、广度优先搜索和A*搜索等在解决...

    poj.grids.cn题型分类

    0-1背包是最经典的背包问题之一,其目标是在容量有限的背包中装入价值最大的物品组合。可以用二维数组`dp[i][j]`表示前`i`个物品装入容量为`j`的背包中的最大价值,其中状态转移方程为`dp[i][j] = max(dp[i-1][j], ...

    POJ 分类题目 txt文件

    动态规划题目通常要求求解最优解,例如背包问题、最长公共子序列等问题。例如,题目poj3267和poj1836就属于动态规划问题,其中poj1836需要通过动态规划找到最优的编辑距离。 ### 5. 数学算法 数学算法涵盖代数、...

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

    01背包问题是最经典的动态规划问题之一,问题描述为:给定一组物品,每种物品都有自己的重量和价值,在限定的总重量内,选择其中一些装入背包,使得背包内物品的总价值最大。而多重背包问题是指有N种物品,每种物品...

    POJ2773_采药_背包_动态规划

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

    poj dp总结,动态规划分类

    这些题目覆盖了基础的动态规划问题,如背包问题、最长递增子序列、矩阵链乘法等。例如: - **1018**:“Falsecoin”——经典的0/1背包问题变种。 - **1178**:“Camelot”——涉及到最短路径问题的变体。 - **...

    POJ-1170.rar_poj

    在编程竞赛中,动态规划通常被用来解决如背包问题、最长公共子序列、最短路径等问题。 对于POJ 1170的具体问题,由于没有给出详细描述,我们可以进行一般性的动态规划知识讲解。动态规划问题通常分为以下几步: 1....

    ACM-POJ 算法训练指南

    3. **贪心算法**:通过局部最优选择来达到全局最优解的方法,如背包问题(poj3295)。 4. **动态规划**:通过分解问题为更小的子问题来解决复杂问题,如斐波那契数列(poj1068, poj2632, poj1573, poj2993, poj2996...

Global site tag (gtag.js) - Google Analytics