您的位置:首页 > 其它

hdu 3217 Health

2011-09-01 21:10 197 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3217

本题是一道状态压缩DP,题目意思很简单,就是说有n种药,为了治病可以搭配着吃,每种告诉你各种搭配及每种搭配能起到了治疗功效,当选择某种搭配的时候他的所有子搭配(即搭配的子集)的功效和就是最终效果,求给处的所有搭配的最大最终效果。

代码如下:

#include <iostream>
#include <cstdio>

using namespace std;

const int maxn=1<<17;

int dp[17][maxn];

int max(int a,int b){
	return a>b?a:b;
}

int main(){
	int n,m,i,j;
	while(scanf("%d",&n)&&n){
		scanf("%d",&m);
		memset(dp,0,sizeof(dp));
		int s,e;
		for(int i=0;i<m;i++){
            scanf("%d%d",&s,&e);
            dp[0][s]=e;
        }
        for(i=1;i<=n;i++){
            for(j=0;j<maxn;j++){
                if(j&(1<<(i-1))){
                    dp[i][j]=dp[i-1][j]+dp[i-1][j-(1<<(i-1))];
                }else {
                    dp[i][j]=dp[i-1][j];
                }
            }
        }
		int ans=-1<<30;
        for(i=0; i<(1<<n);i++) {
            ans = max(ans, dp
[i]);
        }
		printf("%d\n",ans);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: