您的位置:首页 > 其它

ZOJ 2297 Survival (状态dp)

2014-04-15 21:50 316 查看
OJ题目:click here ~~

题目分析:和n个人打架,第n个是boss , boss一定是最后一个打,前面n-1个可任意排序。跟每个人打架需要消耗一定的HP,打赢之后也能恢复一定的HP,由输入提供。判断能不能打赢这n个人。

打boss之前, 共有1 <<(n - 1) 中状态,枚举这么多状态,判断dp[1 << (n - 1)]够不够打boss,即前n-1个人打完之后,HP的最大值 是否大于等于boss 的HP值。

AC_CODE

struct Node
{
int cost;
int rec;
Node(){}
}node[22];

int n;
int dp[1<<20];
int  main(){
while(cin >> n)
{
n--;
int i , j , boss;
for(i = 0;i < n;i++) scanf("%d%d",&node[i].cost,&node[i].rec);
scanf("%d",&boss);
memset(dp , -1 , sizeof(dp));
dp[0] = 100;
for(i = 0;i < (1<<n);i++)
{
if(dp[i] < 0) continue;
for(j = 0;j < n;j++)
{
if(i&(1<<j)) continue;
if(dp[i] < node[j].cost) continue;
int t = dp[i] - node[j].cost + node[j].rec;
if(t >= 100) dp[i|(1<<j)] = 100;
else
dp[i|(1<<j)] = max(dp[i|(1<<j)] , t);
}
}
if(dp[(1<<n) - 1] < boss) printf("try again\n");
else printf("clear!!!\n");
}

return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: