题目: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;
}