Codeforces 580D Kefa and Dishes

题意:

给你n道菜吃,每道菜都能获得a[i]个满意度,此外还有m个规则,在吃y之前吃x能多获得c的满意度,问你如何点菜能获得最多的满意度。

思路:

看到n只有18,而且还要求最多的满意度。直接状压DP,dp[i][j]表示当前正要吃第i道菜,且状态为s。然后只要三重循环枚举。

一重枚举状态s,从0~(1<

二重枚举i,从1~n。

三重枚举j,从1~n。

转移:dp[j][s|(1<

#include
#include
#include
using namespace std;
typedef __int64 LL;

const int INF=0x3f3f3f3f;
const int MAX=20;
LL dp[MAX][1<


你可能感兴趣的:(2016个人训练赛1)