http://poj.org/problem?id=3211

一个背包的简单应用。

我们可以这样想,对于同一种颜色的衣服,把他们的总时间t算出来,那么做一个容量为t/2的背包,背包里放的是这种颜色的衣服,重量是洗这件衣服的时间,价值也是洗

这件衣服的时间,那么洗这种颜色的衣服的所需最小时间就是 max(t-dp【t/2】,dp【t/2】)

用g++交才能过,c++不行,这是怎么个回事??

View Code
#include<iostream>
#include<string.h>
#include<string.h>
#include<stdio.h>
#include<vector>
#include<map>
#define maxn 200
using namespace std;
int t[maxn];
int close[maxn][maxn];
int dp[maxn*maxn];
int c,m;
map<string,int >v;
int main()
{
    string s;
    int a;
    while(cin>>c>>m)
    {
        memset(t,0,sizeof(t));
        memset(close,0,sizeof(close));
        v.clear();//要清空map
        if(!(c+m))break;
        for(int i=1;i<=c;i++)
        {
            cin>>s;
            v[s]=i;//用map,给每一种颜色编号,
        }
        for(int i=1;i<=m;i++)
        {
            cin>>a>>s;
            t[v[s]]+=a;//这种颜色的衣服总时间要增加
   close[v[s]][++close[v[s]][0]]=a;
//二维数组,第一唯是颜色序号,第二唯放的是每一件这种颜色衣服的间
        }
        int ans=0;
        for(int i=1;i<=c;i++)
        {
            memset(dp,0,sizeof(dp));
        for(int j=1;j<=close[i][0];j++)//数目是这种颜色衣服的数目
            {
           for(int k=t[i]/2;k>=close[i][j];k--)//容量是总时间的一半
                {
              dp[k]=max(dp[k],dp[k-close[i][j]]+close[i][j]);//背包
                }
            }
   ans+=max(dp[t[i]/2],t[i]-dp[t[i]/2]);
//求取最大值,该值是洗这种颜色衣服所需的最小时间
        }
        cout<<ans<<endl;
    }
    return 0;
}
posted on 2012-08-29 16:03  一把刷子  阅读(378)  评论(0编辑  收藏  举报