比赛 20121108 评测结果 AAAAAAAAAAAAAAAAAAWA
题目名称 还是“金明的预算方案” 最终得分 95
用户昵称 feng 运行时间 1.681 s
代码语言 C++ 内存使用 10.60 MiB
提交时间 2012-11-08 10:23:23
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
struct node {  
    int v;    
	int p;
    int q;        
}data[61];  
int f[60][32001];           
int n,m,s;  
int ans[32001];  
int main() {
	freopen("budgetb.in","r",stdin);
	freopen("budgetb.out","w",stdout);
    while(cin>>n>>m>>s) {  
        memset(f, -1, sizeof(f));  
        f[0][0] = 0;  
        n /= 10;  
        for(int i = 1; i <= m; i++) {  
            cin >> data[i].v >> data[i].p >> data[i].q;  
            data[i].v /= 10;  
            f[i][0] = 0;  
        }  
        for(int i=1;i<=m;i++){  
            if(data[i].q == 0)continue;  
            for(int j = n; j >= data[i].v; j--) {  
                if(f[data[i].q][j - data[i].v] != -1) {  
                    f[data[i].q][j] = max(f[data[i].q][j], f[data[i].q][j - data[i].v] + data[i].v * data[i].p);  
                }  
            }  
        }  
        for(int i = 1; i <= m; i++) {  
            if(data[i].q != 0) continue;  
            for(int j = n; j >= 0; j--) {  
                if(f[i][j] != -1) {  
                    if(j + data[i].v > n) f[i][j] = -1;  
                    else {  
                        f[i][j + data[i].v] = max(f[i][j + data[i].v], f[i][j] + data[i].v * data[i].p);  
                        f[i][j] = -1;  
                    }  
                }  
            }  
        }  
        memset(ans, -1, sizeof(ans));  
        ans[0] = 0;  
        int _max = 0;  
        for(int i = 1; i <= m; i++) {  
            if(data[i].q != 0) continue;  
            for(int j = n; j >= data[i].v; j--) {  
                for(int k = j; k >= data[i].v; k--) {  
                    if(f[i][k] != -1 && ans[j - k] != -1) {  
                        ans[j] = max(ans[j], f[i][k] + ans[j - k]);  
                        _max = max(_max, ans[j]);  
                    }  
                }  
            }  
        }  
        cout << _max * 10 << endl;  
    }  
    return 0;  
}