这题对每一种颜色的衣服进行01背包,求出每一种最接近该颜色总时间一半的时间,然后总时间减去求出的时间再求和就是所求的时间....其他的就不多说了....
AC代码如下:
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int dp[100001];
inline int max( int a, int b ){
return ( a > b ? a : b );
}
int main(){
int N, M, aa;
int sum, time;
string temp;
vector<string> s;
vector<int> n[10];
while( cin >> M >> N && !( M == 0 && N == 0 ) ){
while( !s.empty() ){
s.pop_back();
}
for( int i = 0; i < 10; i++ ){
while( !n[i].empty() ){
n[i].pop_back();
}
}
for( int i = 0; i < M; i++ ){
cin >> temp;
s.push_back( temp );
}
for( int i = 0; i < N; i++ ){
cin >> aa >> temp;
int j;
for( j = 0; ; j++ ){
if( s[j] == temp ){
break;
}
}
n[j].push_back( aa );
}
time = 0;
for( int i = 0; i < M; i++ ){
sum = 0;
for( vector<int>::iterator j = n[i].begin(); j != n[i].end(); j++ ){
sum += *j;
}
memset( dp, 0, sizeof( dp ) );
for( vector<int>::iterator j = n[i].begin(); j != n[i].end(); j++ ){
for( int k = sum / 2; k >= *j; k-- ){
dp[k] = max( dp[k], dp[k-*j] + *j );
}
}
time += sum - dp[sum/2];
}
cout << time << endl;
}
return 0;
}