syhd142 |
|
|||
日歷
統(tǒng)計
導航常用鏈接留言簿(2)隨筆檔案(23)文章分類(270)
文章檔案(122)我的豆瓣搜索最新評論
閱讀排行榜
評論排行榜 |
多重背包 #include <stdio.h>
#include <string.h> #define N 105 #define MAX(a, b) (a > b ? a : b) int p[N], h[N], c[N], f[N]; void Complete(int cost, int weight, int n) { for(int i = cost; i <= n; i++) f[i] = MAX(f[i], f[i - cost] + weight); } void Zero_One(int cost, int weight, int n) { for(int i = n; i >= cost; i--) f[i] = MAX(f[i], f[i - cost] + weight); } int main() { int t, n, m; scanf("%d", &t); while(t--) { scanf("%d %d", &n, &m); for(int i = 0; i < m; i++) { scanf("%d %d %d", &p[i], &h[i], &c[i]); } memset(f, 0, sizeof(f)); for(int i = 0; i < m; i++) { int tmp = p[i] * c[i]; if(tmp > n) Complete(p[i], h[i], n); else { int k = 1; while(k < c[i]) { Zero_One(k * p[i], k * h[i], n); c[i] -= k; k <<= 1; } Zero_One(c[i] * p[i], c[i] * h[i], n); } } printf("%d\n", f[n]); } return 0; }
|
![]() |
|
Copyright © Fucker | Powered by: 博客園 模板提供:滬江博客 |