hdu 3576
来源:互联网 发布:三维软件介绍 编辑:程序博客网 时间:2024/06/06 14:09
题意:略
思路:如果几个人的同一层下楼的话 这个电梯只要停一次,不同的电梯就各加1,用三维dp记录。状态表示当前电梯人数,记下最优值。
#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>using namespace std;int dp[50][50][50];// 电梯容量 电梯人数int a[20];int main(){ int t,cas=1,c,m,x,sum; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); memset(dp,0x3f,sizeof(dp)); scanf("%d%d",&c,&m); for(int i=0;i<m;i++) { scanf("%d",&x); a[x]++; } dp[0][0][0]=0; sum=0; for(int i=2;i<=16;i++) { if(!a[i])continue; for(int j=c;j>=0;j--) { for(int k=c;k>=0;k--) { for(int l=c;l>=0;l--) { if(j+k+l!=sum)continue; for(int u=0;u<=a[i];u++) { for(int g=0;g+u<=a[i];g++) { x=0; if(u!=0) x++; if(g!=0) x++; if(a[i]-u-g!=0) x++; dp[j+u][k+g][l+a[i]-u-g]=min(dp[j][k][l]+x,dp[j+u][k+g][l+a[i]-u-g]); } } } } } sum+=a[i]; } int ans=20000; for(int j=c;j>=0;j--) { for(int k=c;k>=0;k--) { for(int l=c;l>=0;l--) { if(j+k+l==m) ans=min(ans,dp[j][k][l]); } } } printf("Case %d: %d\n",cas++,ans); } return 0;}
0 0
- hdu 3576
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- Constructor(构造器)是否可被override(重写)?
- 基础知识学习笔记(二)
- B\S备忘录22——少年,不来一发弹幕吗
- C runtime library
- 两个对象用equals方法比较为true,它们的Hashcode值相同吗?
- hdu 3576
- TCP协议中的三次握手和四次挥手(图解)
- 黑马程序员——java基础——IO的学习总结
- sizeof,strlen,二级指针,gdb
- 如何在Windows下编译OpenSSL?
- BreezeJs使用
- redis源码分析 dict字典的实现和内部应用
- ajax xml 实现数据交互 小例子
- OC_属性