您的位置:首页 > 其它

CODE[VS]1014 装箱问题

2017-09-04 17:12 337 查看
题目:http://codevs.cn/problem/1014/

思路:依次将与容量最贴近的货物装入

题解:

/* 1014 装箱问题 */
#include <stdio.h>

#define DEBUG

#define MAXN 30

int v, n;           /* 容量,货物数 */
int goods[MAXN];    /* 货物体积 */
int all, remain;    /* 已装总体积,剩余空间 */
/* 排序货物体积 */
void swap(int a, int b){
int t;
t = goods[a];
goods[a] = goods[b];
goods[b] = t;
}
void sort(){
int i, j;
for(i = 0; i < n; i++){
for(j = i; j < n; j++){
if(goods[i] < goods[j]){
swap(i, j);
}
}
}
}

/* 贪心求解 */
void box(int depth){
int i;
for(i = depth; i < n; i++){
/* 将货物放入箱子 */
all = all + goods[i];
/* 容量有剩余,继续装入货物 */
if(all <= v){
if(remain > (v - all)){
remain = v - all;
}
box(i + 1);
}
/* 将当前货物取出,放入其他货物 */
all = all - goods[i];
}
}
/* 主函数入口 */
int main(int argc, char *argv[]) {
int i;
#ifdef DEBUG
FILE *fp;
if(NULL == (fp = fopen("data.txt", "r"))){
return 1;
}
#endif
/* 获取容量,货物数 */
#ifdef DEBUG
fscanf(fp, "%d", &v);
fscanf(fp, "%d", &n);
#else
scanf("%d", &v);
scanf("%d", &n);
#endif
for(i = 0; i < n; i++){
#ifdef DEBUG
fscanf(fp, "%d", &goods[i]);
#else
scanf("%d", &goods[i]);
#endif
}
/* 排序货物体积 */
sort(goods);

all = 0;
remain = v;
box(0);
printf("%d", remain);
#ifdef DEBUG
fclose(fp);
#endif
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: