题目大意:两个人同时洗一种颜色的衣服 洗完才能洗下一种颜色的衣服 求把所有种类的衣服洗完最少时间
题解:把每种颜色的衣服转化为必须装满的背包 求最接近每种颜色衣服总时间sum[i]/2的值即dp[mid]
把sum-dp[mid]累加就是答案
#include <iostream> #include<cstring> using namespace std; char color[12][21],temp[21]; bool dp[100000]; int h[12][100],sum[12],t[12]; int getid(char *a) { for(int i=1; i<12; i++) if(strcmp(color[i],a)==0) return i; return 0; } int main() { int m,n,time; while(cin>>m>>n&&(m+n)) { for(int i=1; i<=m; i++) cin>>color[i],sum[i]=t[i]=0; for(int j=1; j<=n; j++) { cin>>time>>temp; int k=getid(temp); h[k][t[k]++]=time; sum[k]+=time; } int ans=0; for(int i=1; i<=m; i++) { memset(dp,0,sizeof(dp)); dp[0]=1; for(int j=0; j<t[i]; j++) for(int k=sum[i]-h[i][j]; k>=0; k--) if(dp[k]) dp[k+h[i][j]]=1; for(int j=sum[i]/2; j>=0; j--) if(dp[j]) { ans+=(sum[i]-j); break; } //也可以像底下这么写 /* for(int j=sum[i]%2?sum[i]/2+1:sum[i]/2; j<=sum[i]; j++) if(dp[j]) { ans+=j; break; }*/ } cout<<ans<<endl; } return 0; }