hdu 1074 Doing Homework
来源:互联网 发布:昕搜网络 编辑:程序博客网 时间:2024/06/08 05:21
给出
因为是要求一个排列,而且
最后要求字典序最小,那么在转移的时候优先考虑字典序最大的前一个状态(因为转移是从后往前的
剩下的就是代码了
#include<stack>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define LL long longconst int maxn = 16;const int INF = 0x3f3f3f3f;int dp[1<<maxn],pre[1<<maxn];int dl[maxn],last[maxn];char arr[maxn][110];int n;int slast(int S){ int ret = 0; for(int i=0;i<n;i++){ if(S&(1<<i)) ret += last[i]; } return ret;}int dfs(int S){ if(dp[S] != INF){ return dp[S]; } int sumer = slast(S); for(int i=0;i<n;i++){ if(S&(1<<i)){ int ndp = dfs(S-(1<<i)) + max(0,sumer-dl[i]); if(ndp <= dp[S]){ dp[S] = ndp,pre[S] = i; } } } return dp[S];}int main(){ int T; scanf("%d",&T); while(T-- && ~scanf("%d",&n)){ for(int i=0;i<n;i++){ scanf("%s %d %d",arr[i],&dl[i],&last[i]); } int all = (1<<n)-1; memset(dp,0x3f,sizeof(dp)); memset(pre,-1,sizeof(pre)); dp[0] = 0; printf("%d\n",dfs(all)); stack<int> S; while(all){ S.push(pre[all]); all -= (1<<pre[all]); } while(S.empty()==false){ printf("%s\n",arr[S.top()]); S.pop(); } } return 0;}
0 0
- HDU 1074 Doing Homework
- hdu 1074 Doing Homework
- HDU-1074-Doing Homework
- hdu 1074 Doing Homework
- hdu 1074 Doing Homework
- hdu-1074-Doing Homework
- HDU - 1074 Doing Homework
- HDU 1074 Doing Homework
- HDU 1074 Doing Homework
- hdu-1074 Doing Homework
- HDU 1074 Doing Homework
- hdu 1074 Doing Homework
- HDU 1074Doing Homework
- HDU-1074-Doing Homework
- hdu 1074 doing homework
- HDU 1074 Doing Homework
- HDU 1074 Doing Homework
- hdu 【1074】Doing Homework
- vb
- iOS9.0 关于app接入支付宝,跳转到支付宝app(不是网页)支付成功后,不回调到解决办法
- 第11周项目2-储存班长信息的同学类 (2)
- RxJava变换操作符:.concatMap( )与.flatMap( )的比较
- Objective-C Runtime
- hdu 1074 Doing Homework
- 如何避免scope的query界面切换到preview界面
- 卸载mac系统下openfire
- 平行四边形
- 如何为Tomcat服务器上的多个app配置公共的logback.xml
- wampserver安装(php的环境)
- 韩顺平Spring框架学习,学习笔记(十一)
- mongo对内嵌数组的操作
- leetcode---Sudoku Solver---深搜