• poj 3211 Washing Clothes (分组背包)


     1 /*************************************
     2 
     3 题目:    Washing Clothes(poj 3211)
     4 链接:    http://poj.org/problem?id=3211
     5 算法:    分组背包
     6           由于题目有字符串不好处理,用map
     7           函数来处理后做法和一般分组背包
     8           一样了。然后对没中颜色做01背包
     9           就可以了。
    10 
    11 **************************************/
    12 
    13 
    14 #include<iostream>
    15 #include<map>
    16 #include<cstdio>
    17 #include<cstring>
    18 using namespace std;
    19 
    20 map<string,int>g1,g2;        ///g1记录每个颜色出现的循序,
    21                              ///g2记录每个颜色出现的次数。
    22 
    23 int a[15][150];
    24 char s[150][15];
    25 int dp[10000];
    26 
    27 int main()
    28 {
    29     int n,m,i,j,k;
    30     while (~scanf("%d%d",&n,&m))
    31     {
    32         if (n==0&&m==0) return 0;
    33         g1.clear();
    34         g2.clear();
    35         for (i=0;i<n;i++)
    36         {
    37             scanf("%s",&s[i]);
    38             g1[s[i]]=i;
    39         }
    40         while (m--)
    41         {
    42             char s[15];
    43             int x;
    44             scanf("%d %s",&x,&s);
    45             a[g1[s]][g2[s]++]=x;
    46         }
    47         int ans=0;
    48 
    49         /// 分组背包
    50         for (i=0;i<n;i++)
    51         {
    52             memset(dp,0,sizeof(dp));
    53             int cut=0;
    54             for (j=0;j<g2[s[i]];j++) cut+=a[i][j];
    55             for (j=0;j<g2[s[i]];j++)      ///01背包
    56             {
    57                 for (k=cut/2;k>=a[i][j];k--)
    58                 dp[k]=max(dp[k],dp[k-a[i][j]]+a[i][j]);
    59             }
    60             ans+=cut-dp[cut/2];
    61         }
    62 cout<<ans<<endl; 63 } 64 }
  • 相关阅读:
    第1次系统综合实践作业
    个人作业——软件工程实践总结
    个人作业——软件评测
    2019软件工程第五次作业
    预习非数值数据的编码方式
    预习原码补码作业
    C语言寒假大作战04
    C语言寒假大作战03
    C语言寒假大作战02
    C语言寒假大作战01
  • 原文地址:https://www.cnblogs.com/pblr/p/5326908.html
Copyright © 2020-2023  润新知