题目链接: POJ—1017 Packets
直接用6*6的大箱子,然后从大到小往里装就行了。
/***********************************
Problem: 1017 User: ChenyangDu
Memory: 656K Time: 219MS
Language: G++ Result: Accepted
*************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int in[7],mod[7][7],ans;//in是输入的数据
//mod(不要问我为什么叫这个名字)是一直操作的箱子
void input(){
for(int i=1;i<=6;i++){
scanf("%d",&in[i]);
}
}
bool is_empty(){ //判断in里面是不是空了
for(int i=1;i<=6;i++){
if(in[i] != 0)return false;
}
return true;
}
bool acc(int x,int y,int size){//在(x,y)这个位置能不能放下size的产品
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
if(mod[x+i][y+j] != 0)return false;
}
}
return true;
}
void fill(int x,int y,int size){ //将产品放入
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
mod[x+i][y+j] = size;
}
}
}
int main(){
//freopen("in.txt","r",stdin);
while(1){
input();
if(is_empty())break;
ans = 0;
while(1){
memset(mod,0,sizeof(mod));
for(int i=6;i>=1;i--){
if(in[i] == 0)continue;
for(int x = 1;x<=6-i+1;x++){
for(int y = 1;y<=6-i+1;y++){
if(acc(x,y,i)){
fill(x,y,i);
in[i] --;
}
if(in[i] == 0)goto next;
}
}
next:;
}
ans ++;
/*
for(int i=1;i<=6;i++){
for(int j=1;j<=6;j++){
cout<<mod[i][j]<<" ";
}cout<<endl;
}cout<<endl;
*/
if(is_empty())break;
}
printf("%d\n",ans);
}
return 0;
}

本文提供了一种解决POJ—1017Packets问题的有效算法,通过使用6*6大小的箱子,并从大到小依次装箱的方法,实现了物品的最佳装载方案。

683

被折叠的 条评论
为什么被折叠?



