HDU 1074 Doing Homework
2015-10-14 16:44
309 查看
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1074题意:
给出一些科目作业的完成所需时间和最后期限,每比最后期限晚1天交就要减一学分,求如何安排写作业能够让被减的学分尽可能的少。思路:
简单状压dp,数据很小所以开一个dp结构体,包含t,s,pos,res[16]就是在i状态时所需时间,最小扣分,已写作业数,写作业顺序。然后状压0到(1<<n)枚举所有状态的下一个状态更新就行了。复杂度(1<<n)*n;
代码:
#define INF 0x3f3f3f3f #define N 112345 #define M 112 int n,m; int flag,sum,ave,ans,res,len,ans1,ans2; int a[M],b[M]; char s[M][101]; struct node { int t,s; int res[16],pos; }dp ; int main() { int i,j,k,kk,t,x,y,z; scanf("%d",&k); while(k--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%s%d%d",&s[i],&a[i],&b[i]); for(i=0;i<=(1<<n);i++) dp[i].s=INF; dp[0].t=dp[0].s=dp[0].pos=0; for(i=0;i<(1<<n);i++) for(j=0;j<n;j++) { t=(1<<j); if(t&i)continue; x=t|i; dp[x].t=dp[i].t+b[j]; dp[x].pos=dp[i].pos+1; t=max(dp[x].t-a[j],0); if(dp[i].s+t<dp[x].s) { dp[x].s=dp[i].s+t; memcpy(dp[x].res,dp[i].res,sizeof(dp[i].res)); dp[x].res[dp[x].pos]=j; } } t=(1<<n)-1; printf("%d\n",dp[t].s); for(i=1;i<=dp[t].pos;i++) printf("%s\n",s[dp[t].res[i]]); } return 0; }
相关文章推荐
- androidstudio 常用快捷键
- 【转】管理员必备的Linux系统监控工具
- 身份证合法性验证
- 回归、插值、逼近、拟合的区别
- 浅谈类加载机制
- Linux的权限和所有权模型
- 5、Robot Framework必须掌握的库----BuiltIn库
- win7系统旗舰版中Flash Player被禁用怎么办?win7系统Flash Player被禁用后的开启方法
- 模拟三次密码输入
- HttpURLConnection请求出现乱码解决方案
- In-Cell、On-Cell、OGS三种屏幕技术
- iOS 解析JSON格式字符串
- FastMM内存泄露
- LRU Cache -- leetcode
- 词法分析修改版
- 接口的理解(广播检测网络是否连接的例子)
- 4、DatabaseLibrary 库-数据库的应用
- <LeetCode><Easy>237Delete Node in a Linked List ****
- nrf51822 如何更改发射功率
- 大索引技术的潮流