Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Multiple && Complete Pack[不转01; 可以不排序]/** * POJ: 3260 The Fewest Coins * * DP: Multiple/Complete Pack * * !!! TLE !!! */ /** ***/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> /** ***/ #define N 100 #define T 10000 #define SP T + 10 #define FJ SP #define SUBMIT 1 /** ***/ #define min(a, b) ( (a) < (b) ? (a) : (b) ) #define max(a, b) ( (a) > (b) ? (a) : (b) ) /** ***/ int knd; // kinds of coins(N); int cst; // the total cost(T); int fj[FJ + 1]; // fj[i]: FJ付款i所用的最小coins int sp[SP + 1]; // sp[j]: SP找零j所用的最小coins typedef struct { int val; int cnt; } coin_t; coin_t con[N + 1]; /** ***/ int compar(const void *p1, const void *p2) { /* descending order */ return ((coin_t *)p2)->val - ((coin_t *)p1)->val; } /** ***/ int main(int argc, char **argv) { #ifndef SUBMIT freopen("input/3260", "r", stdin); #endif int ans = INT_MAX; int mny = 0; // the maximum coins FJ can pay while (2 == scanf("%d%d", &knd, &cst)) { /* init */ ans = INT_MAX; memset(fj, 0, sizeof(fj)); memset(sp, 0, sizeof(sp)); /* input */ for (int i = 1; i <= knd; ++i) { scanf("%d", &con[i].val); } for (int i = 1; i <= knd; ++i) { scanf("%d", &con[i].cnt); } /* sort */ qsort(con + 1, knd, sizeof(coin_t), compar); /* dp -- fj */ for (int i = 1; i <= knd; ++i) { if (!con[i].cnt) { // cnt == 0 时:跳过 continue; } for (int j = mny, nxt; j >= 0; --j) { if (!fj[j] && j) {// fj[j] == j 时的最小值 continue; // fj[0] == 0; } for (int k = 1; k <= con[i].cnt; ++k) { nxt = j + k * con[i].val; if (nxt > T) { break; } if (!fj[nxt]) { fj[nxt] = fj[j] + k; } else { fj[nxt] = min(fj[nxt], fj[j] + k); } mny = max(mny, nxt); } } } /* little optimizations */ if (mny < cst) { printf("-1\n"); continue; } /* dp -- sp */ for (int i = 1; i <= knd; ++i) { for (int j = 1, nxt; j <= mny - cst; ++j) { for (int k = 1; ; ++k) { nxt = k * con[i].val; if (nxt > j) { break; } // 求的是__j可以达到时候__的最小值 if (!sp[j - nxt] && (j ^ nxt)) { continue; } if (!sp[j]) { sp[j] = sp[j - nxt] + k; } else { sp[j] = min(sp[j], sp[j - nxt] + k); } } } } /* resolve */ if (fj[cst]) { ans = min(ans, fj[cst]); } for (int i = cst + 1; i <= mny; ++i) { if (fj[i] && sp[i - cst]) { ans = min(ans, fj[i] + sp[i - cst]); } } /* output */ ans == INT_MAX ? printf("-1\n") : printf("%d\n", ans); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator