CodeVS 1155 金明的预算方案 题解

来源:互联网 发布:ne452cha支持什么网络 编辑:程序博客网 时间:2024/06/14 07:27

分组背包问题

时间复杂度:O(M*N/10)

空间复杂度:O(N/10)

#include <cstdio>#include <memory.h>using namespace std;int N, M;int v, p, q;int tmp, Sum, Max;struct THING{bool Main;short int num;int Sum[4];int V[4];}thing[60+2];int f[3200+2];int main() {scanf("%d %d", &N, &M);for(int i = 1; i<=M; ++i){scanf("%d %d %d", &v, &p, &q);Sum = v*p;v /= 10;if(q==0){thing[i].Main = true;for(int j = 0; j<4; ++j) thing[i].Sum[j] += Sum;for(int j = 0; j<4; ++j) thing[i].V[j] += v;}else{tmp = ++thing[q].num;thing[q].Sum[tmp] += Sum; thing[q].Sum[3] += Sum;thing[q].V[tmp] += v; thing[q].V[3] += v;}}for(int i = 1; i<=M; ++i){if(!thing[i].Main) continue;for(int j = N/10; j>=1; --j){Max = f[j];for(int k = 0; k<4; ++k){tmp = j-thing[i].V[k];if(tmp<0) continue;if((f[tmp]+thing[i].Sum[k])>Max) Max = f[tmp]+thing[i].Sum[k];}f[j] = Max;}}printf("%d\n", f[N/10]);    return 0;}


原创粉丝点击