您的位置:首页 > 其它

HDU 1494 跑跑卡丁车 0-1背包

2012-08-26 16:13 162 查看
还不错的一道题目,要注意看清题意。

注意:

1. 普通行驶的情况下,每通过1段赛道,可以获得20%的能量(N2O). 所以加速情况不加能量

2. 能量集满后获得一个加速卡(同时能量清0). 加速卡最多可以储存2个,也就是说当你有2个加速卡而能量再次集满,那么能量清零但得不到加速卡。

看清题目的话, 这题状态转移推一下,不是很难。

View Code

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 1<<29

int n, l;
int dp[101][15];
int a[101], b[101];

int main()
{
int i, j, k;
while( ~scanf("%d%d", &l, &n) )
{
for(i = 1; i <= l; i++)
scanf("%d", &a[i]);
for(i = 1; i <= l; i++)
scanf("%d", &b[i]);
for(i = 1 ; i < 15; i++)
dp[0][i] = inf;
dp[0][0] = 0;
for(k = 1; k <= n; k++)
{
for(i = 1; i <= l; i++)
for(j = 0; j < 15; j++)
{
if(j == 0)
dp[i][j] = dp[i-1][j+5] + b[i]; //0是加速后才能出现的状态
else if(j == 10)  //考虑当有2张加速卡和80%的能量时,  加了能量,变为只有2张加速卡
dp[i][j] = min(dp[i-1][j-1], dp[i-1][14]) + a[i];
else if(j + 5 < 15)  //选择是不是加速
dp[i][j] = min(dp[i-1][j-1] + a[i], dp[i-1][j+5] + b[i]);
else //其它情况都无法加速,只能普通行驶
dp[i][j] = dp[i-1][j-1] + a[i];
}
for(j = 0; j < 15; j++)//对每圈的状态进行滚动操作,大大节约了内存
dp[0][j] = dp[l][j];
}
int ans = dp[l][0];
for(i = 1; i < 15; i++)
ans = min(ans, dp[l][i]);
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: