码迷,mamicode.com
首页 > 其他好文 > 详细

POJ - 3257 Cow Roller Coaster (背包)

时间:2018-02-17 17:51:04      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:data-   cpp   names   uil   gpo   pop   art   sdn   eof   

题目大意:要用N种材料建一条长为L的路,如今给出每种材料的长度w。起始地点x。发费c和耐久度f
问:在预算为B的情况下,建好这条路的最大耐久度是多少

解题思路:背包问题
dp[i][j]表示起始地点为i。发费为j的最大耐久度
可得转移方程
dp[i + w][j + c] = max(dp[i + w][j + c],dp[i][j] + f)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxl 1010
#define maxn 10010
#define INF 0x3f3f3f3f
int L, N, B;
int dp[maxl][maxl];
struct component {
    int x, w, f, c;
}com[maxn];

int cmp(const component a, const component b) {
    return a.x < b.x;
}

void init() {
    for(int i = 0; i < N; i++)
        scanf("%d%d%d%d", &com[i].x, &com[i].w, &com[i].f, &com[i].c);
    sort(com, com + N, cmp);
}

void solve() {
    memset(dp, -1, sizeof(dp));
    dp[0][0] = 0;
    for(int i = 0; i < N; i++) {
        for(int j = 0; j <= B - com[i].c; j++)
            if(dp[com[i].x][j] != -1) {
                dp[com[i].x + com[i].w][j + com[i].c] = max(dp[com[i].x + com[i].w][j + com[i].c], dp[com[i].x][j] + com[i].f) ;
            }
    }

    int ans = -1;
    for(int i = 0; i <= B; i++)
        if(dp[L][i] != INF)
            ans = max(ans, dp[L][i]);
    printf("%d\n", ans);
}

int main() {
    while(scanf("%d%d%d", &L, &N, &B) != EOF ) {
        init();
        solve();
    }
    return 0;
}

POJ - 3257 Cow Roller Coaster (背包)

标签:data-   cpp   names   uil   gpo   pop   art   sdn   eof   

原文地址:https://www.cnblogs.com/llguanli/p/8452014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!