poj 3211 Washing Clothes(0/1背包)

简介: 点击打开链接poj 3211 思路: 0/1背包 分析: 1 题目要求洗完n件衣服所需的最少的时间,并且必须洗完一种颜色才能跳到下一种 2 仔细想想这一题和uva上面的一道分金币非常的相似,由于要求必须洗完一种颜色才能跳到下一种,那么我们...

点击打开链接poj 3211

思路: 0/1背包
分析:
1 题目要求洗完n件衣服所需的最少的时间,并且必须洗完一种颜色才能跳到下一种
2 仔细想想这一题和uva上面的一道分金币非常的相似,由于要求必须洗完一种颜色才能跳到下一种,那么我们只要使得洗每一种颜色的时间最少那么总的就最少,那怎样才能够最少的时间呢?也就是要求两个人的时间差最小(也就相当于一个人用一半的时间去能够洗的最多的衣服),那么就转化为0/1背包的思想
3 做m次的dp然后求和即可

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 15;
const int MAXN = 100010;

int m , n;
int w[N][N] , pos[N];
int sum[N] , dp[MAXN];
char color[N][N];

int returnIndex(char *str){
    for(int i = 1 ; i <= m ; i++)
        if(!strcmp(str , color[i]))
            return i;
}

int solve(){
    int ans = 0;
    for(int i = 1 ; i <= m ; i++){
        memset(dp , 0 , sizeof(dp)); 
        for(int j = 1 ; j <= pos[i] ; j++)
            for(int k = sum[i]/2 ; k >= w[i][j] ; k--)
                dp[k] = max(dp[k] , dp[k-w[i][j]]+w[i][j]); 
        ans += sum[i]-dp[sum[i]/2];
    }
    return ans;
}

int main(){
    char str[N];
    int x;
    while(scanf("%d%d" , &m , &n) && n+m){
        for(int i = 1 ; i <= m ; i++)
            scanf("%s" , color[i]); 
        memset(pos , 0 , sizeof(pos));
        memset(sum , 0 , sizeof(sum));
        for(int i = 1 ; i <= n ; i++){
            scanf("%d %s" , &x , str); 
            int index = returnIndex(str);
            pos[index]++; 
            sum[index] += x;
            w[index][pos[index]] = x;
        }
        printf("%d\n" , solve());
    }
    return 0;
}




目录
打赏
0
0
0
0
15
分享
相关文章
poj 3628 Bookshelf 2 (0/1背包)
点击打开链接poj 3628 思路: 0/1背包 分析: 1 题目抽象出来的话就是0/1背包 2 我们用dp[i][j]表示前i头牛放在高度为j的最小高度,那么我们只要求出 dp[n][B~s]中的最小值,然后减去B即可 代码: ...
824 0
poj Dollar Dayz(完全背包)
点击打开链接poj 3181 思路: 完全背包+高精度 分析: 1 题目是裸的完全背包,但是要注意的一个地方是要用高精度 代码: #include #include #include #include using namespa...
985 0
hdu 2955 Robberies(0/1背包)
点击打开链接hdu 2955 思路: 0/1背包 分析: 1 按照题目的意思我们很容易知道这就是一个0/1背包问题,如果我们把概率当作是背包的容量,那么我们遇到一个问题就是浮点数的dp,因为题目没有告诉我们小数点具体几位,那么我们就不能够通...
874 0
hdu 2546 饭卡(0/1背包)
点击打开链接hdu 2546 思路: 贪心+0/1背包 分析: 1 题目中收到只有当余额大于等以5的时候才可以买东西,那么我们利用m-5去买这样保证了于额不会小于5,那么这样就可以买东西了,因为最后可能还有点于额(为0)的时候也是可以买的,那么最后一次就买最贵的这样保证于额最少了。
923 0
|
10月前
01背包和完全背包
01背包和完全背包
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(二)
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(二)
314 0
动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)(二)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等