链接:点击打开链接
题意:有N件衣服,M种颜色,夫妻二人可以同时一人洗一件衣服,为了防止衣服被染色,只能洗完一种颜色的衣服后再洗其余颜色的衣服,问花费时间最少是多少
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct node{
char str[50];
int num,sum;
int w[105];
}s[105];
int main(){ //相同颜色的衣服必须洗完才能洗下一种颜色的
char c[15]; //因此,当两人洗同种颜色的衣服时间相差越少时,
int dp[100005]; //也就是其中一个人等待时间越短时,总用时最短
int m,n,i,j,k,ans,time;
while(cin>>m>>n&&(m||n)){
ans=0;
for(i=0;i<m;i++){
cin>>c;
strcpy(s[i].str,c);
s[i].num=s[i].sum=0;
}
for(i=0;i<n;i++){
cin>>time>>c;
for(j=0;j<m;j++){
if(strcmp(s[j].str,c)==0){
s[j].sum+=time;
s[j].w[s[j].num++]=time;
}
}
}
for(i=0;i<m;i++){ //对每种颜色用01背包求解
memset(dp,0,sizeof(dp));
for(j=0;j<s[i].num;j++)
for(k=s[i].sum;k>=2*s[i].w[j];k--)
dp[k]=max(dp[k],dp[k-2*s[i].w[j]]+2*s[i].w[j]);
ans+=(s[i].sum-dp[s[i].sum]/2);
}
printf("%d\n",ans);
}
return 0;
}