01背包
View Code
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; #define maxn 105 #define maxm 15 #define maxl 50 #define maxt maxn * 1000 struct Cloth { int t, c; }cloth[maxn]; int m, n; char color[maxm][maxl]; bool f[maxt]; bool operator < (const Cloth &a, const Cloth &b) { return a.c < b.c; } int getid(char *a) { for (int i = 0; i < m; i++) if (!strcmp(a, color[i])) return i; return -1; } void input() { for (int i = 0; i < m; i++) scanf("%s", color[i]); for (int i = 0; i < n; i++) { char temp[maxl]; scanf("%d%s", &cloth[i].t, temp); cloth[i].c = getid(temp); } } int bag(int w[], int num, int sum) { memset(f, 0, sizeof(bool) * (sum + 1)); f[0] = true; for (int i = 0; i < num; i++) for (int j = sum; j - w[i] >= 0; j--) f[j] = f[j] || f[j - w[i]]; int ret = sum; while (!f[ret]) ret--; return ret; } void work() { int l = 0; int wash[maxn]; int ans = 0; for (int i = 0; i < m; i++) { int x = 0; int sum = 0; while (cloth[l].c == i) { wash[x++] = cloth[l].t; sum += cloth[l].t; l++; } ans += sum - bag(wash, x, sum / 2); } printf("%d\n", ans); } int main() { //freopen("t.txt", "r", stdin); while (scanf("%d%d", &m, &n), m | n) { memset(cloth, -1, sizeof(cloth)); input(); sort(cloth, cloth + n); work(); } return 0; }