hdu 1074 状压dp
2015-05-10 10:26
330 查看
题意:有n门课,每门课有截止时间和完成所需的时间,如果超过规定时间完成,每超过一天就会扣1分,问怎样安排做作业的顺序才能使得所扣的分最小
链接:点我
链接:点我
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using namespace std; #define MOD 1000000007 const int INF=0x3f3f3f3f; const double eps=1e-5; typedef long long ll; #define cl(a) memset(a,0,sizeof(a)) #define ts printf("*****\n"); const int MAXN=16; int n,m,tt; int dp[1<<MAXN]; int pre[1<<MAXN]; struct node { int d,c; char ss[100]; }nn[MAXN]; void printpath(int st) { if(st==0) return; int flag=0; for(int i=0;i<n;i++) { if( ((st&(1<<i))!=0)&&(pre[st]&(1<<i))==0) //之前有而现在没有,这里括号一定要括好,太坑爹了 { flag=i; break; } } printpath(pre[st]); printf("%s\n",nn[flag].ss); } int main() { int i,j,k; #ifndef ONLINE_JUDGE freopen("1.in","r",stdin); #endif scanf("%d",&tt); while(tt--) { scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s%d%d",&nn[i].ss,&nn[i].d,&nn[i].c); } for(i=0;i<(1<<n);i++) dp[i]=INF; dp[0]=0; for(i=0;i<(1<<n);i++) { for(j=0;j<n;j++) { int s=0; if(i&(1<<j)) continue; //已经做过了 for(k=0;k<n;k++) { if(i&(1<<k)) s+=nn[k].c; } s+=nn[j].c; if(s>nn[j].d) s-=nn[j].d; else s=0; if(dp[i|(1<<j)]>dp[i]+s) { dp[i|(1<<j)]=dp[i]+s; pre[i|(1<<j)]=i; } } } printf("%d\n",dp[(1<<n)-1]); printpath((1<<n)-1); } return 0; }
相关文章推荐
- hdu 1074 Doing Homework(状压DP)
- hdu-1074(状压dp)
- hdu 1074 Doing Homework(状压DP)
- hdu-1074 Doing Homework (状压dp)
- HDU 1074 Doing Homework(状压DP)
- hdu 1074 Doing Homework(状压DP)
- HDU - 1074 Doing Homework(状压dp)
- HDU-1074 Doing Homework( 状压DP )
- hdu 1074 Doing Homework(状压DP)
- HDU 1074 Doing Homework(状压DP)
- hdu 1074 Doing Homework(状压dp)
- HDU 1074 Doing Homework (状压dp)
- hdu 1074 Doing Homework (状压dp)
- hdu 1074 Doing Homework(状压dp)
- hdu1074(状压DP)
- hdu 1074 Doing Homework(状压DP)
- hdu 1074 Doing Homework (状压dp)
- hdu 1074 Doing Homework(状压DP)
- HDU - 1074 Doing Homework(状压DP)
- hdu1074 状压dp