http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2297
越来越觉得位运算好神啊。。。
用位运算来保存每个状态
#include <vector>
#include <list>
#include <map>
#include <set>
#include <string.h>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
#define LL long long
#define pi acos(-1)
#define N 1<<20+10
#define INF 999999999
#define eps 1e-8
//****************************************
//zoj2297 DP
//Copyright@leolin All rights reserved.
//****************************************
int dp[(1<<20)+10];
int a[N],b[N];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{int i,j,k;
int c;
n--;
for(i=0;i<n;i++)
scanf("%d%d",&a[i],&b[i]);
scanf("%d",&c);
int m=1<<n;
for(i=1;i<m;i++) dp[i]=-1;
dp[0]=100;
for(i=1;i<m;i++)
{
for(j=0;j<n;j++)
{
if( i&(1<<j) && dp[i-(1<<j)]>=a[j] &&i-(1<<j)>=0)
{
dp[i]=max(dp[i-(1<<j)]-a[j]+b[j],dp[i]);
if(dp[i]>100)dp[i]=100;
}
}
}
if(dp[m-1]>=c)
printf("clear!!!\n");
else
printf("try again\n");
}
return 0;
}