Doing Homework HDU - 1074 状态压缩
Posted qingyuyyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Doing Homework HDU - 1074 状态压缩相关的知识,希望对你有一定的参考价值。
#include<iostream> #include<cstring> #include<cstdio> #include<string> #include<cmath> using namespace std; const int INF=0x3f3f3f3f; const int MAXN=(1<<15)+5; const int MOD=1e9+7; int dead[20],cost[20]; int dp[MAXN],t[MAXN]; char s[20][105]; int pre[MAXN]; void print(int x) { if(x==0) return; print(x^(1<<pre[x])); printf("%s ",s[pre[x]] ); } int main() { int T; scanf("%d",&T); while(T--) { memset(pre,0,sizeof pre); int n; scanf("%d",&n); for(int i=0; i<n; i++) scanf("%s%d%d",s[i],&dead[i],&cost[i] ); for(int i=1; i<(1<<n); i++) { dp[i]=INF; for(int j=n-1; j>=0; j--) { int tmp=1<<j; //如果没有做 if(! (i&tmp) ) continue; //做这个题之后的分数+花费-期限=扣得分 int score=t[i^tmp]+cost[j]-dead[j]; //如果小于,说明不扣分 if(score<0) score=0; //如果当前的状态扣的分数 > 做这个题之后扣的分 if(dp[i]>dp[i^tmp]+score) { //分数 dp[i]=dp[i^tmp]+score; //花的时间 t[i]=t[i^tmp]+cost[j]; //转移状态,这个状态下做的题 pre[i]=j; } } } printf("%d ", dp[(1<<n)-1]); print((1<<n)-1); } return 0; }
以上是关于Doing Homework HDU - 1074 状态压缩的主要内容,如果未能解决你的问题,请参考以下文章
[2016-03-28][HDU][1074][Doing Homework]