1. 程式人生 > >POJ - 3257 Cow Roller Coaster (背包)

POJ - 3257 Cow Roller Coaster (背包)

pan inf names .cn pretty 問題 eas 思路 dsm

題目大意:要用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 (背包)