SOJ 2930_积木城堡
2015-11-24 00:41
381 查看
【题意】若干个城堡,给定每个城堡的积木数及每块积木的棱长。从城堡中抽出积木使每块城堡高度相同,求最大高度
【分析】城堡的积木选择可以看成01背包问题,从最矮的城堡高度开始依次递减,求出使每个背包都能装满的最大高度。
【代码】
感觉自己写的好笨,看了白神的代码 感觉有些地方可以优化的=。=(比如对每个城堡积木个数的记录,还有一些细节问题)为了保证原创性,就先不改了,记住就好:)
【分析】城堡的积木选择可以看成01背包问题,从最矮的城堡高度开始依次递减,求出使每个背包都能装满的最大高度。
【代码】
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> const int INF=0x3fffffff; const int maxn=110; int n[maxn]; int h[maxn][maxn]; int v[10100]; using namespace std; int main (void) { int T,N,a,total,flag,minn,i; scanf("%d",&T); while(T--) { scanf("%d",&N); minn=INF; memset(n,0,sizeof(n)); memset(h,0,sizeof(h)); for(int k=0;k<N;k++) { total=0; scanf("%d",&a); while(a!=-1) { h[k][n[k]]=a; total+=a; n[k]++; scanf("%d",&a); } minn=min(total,minn); } for(i=minn;i>0;i--) { flag=0; for(int j=0;j<N;j++) { fill(v,v+10100,INF); v[0]=0; for(int k=0;k<n[j];k++) for(int m=i;m>=h[j][k];m--) v[m]=min(v[m],v[m-h[j][k]]+h[j][k]); if(v[i]!=INF) flag++; } if(flag==N) break; } printf("%d\n",i); } return 0; }
感觉自己写的好笨,看了白神的代码 感觉有些地方可以优化的=。=(比如对每个城堡积木个数的记录,还有一些细节问题)为了保证原创性,就先不改了,记住就好:)
相关文章推荐
- 结构体数据的逆向练习
- 冒泡排序法、选择排序法和插入排序法的排序过程
- 通过配置透明大页,提高kvm的性能
- {Elements of Programming}
- MySQL存储过程 创建
- worktile----a to do list
- MYSQL 重置自增
- mybatis insert with id return
- ASP.NET中RouteValueDictionary的一点理解
- 指针的初级知识点总结
- 关于 Windows XP 与 HTTPS 兼容的事情
- 统计字符
- IOS网络访问之使用AFNetworking
- Unbuntu 14.4Tab键不能自动补全
- iOS开发多线程-创建线程
- Hadoop+Hive(MySQL)+Hbase+zookeeper
- JS函数各种跨域方法
- HDU 1203 I NEED A OFFER (01背包&&概率dp)
- linux常用命令
- 整数n转换为以b进制的数,itob