Time Limit: 1000ms second
Memory Limit: 32m 问题描述:
有n个集装箱要装上一艘载重量为c的轮船,其中集装箱i的重量为wi。找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能中的集装箱装上轮船。
Input
第一行有2个正整数n和c,n是集装箱数,c是轮船的载重量。第二行有n个正整数,表示每个集装箱的重量
Output
计算出的最大载重量
Sample Input
5 10 7 2 6 5 4
Sample Output
10
【题解】
这是个组合问题,不要看成排列的,因为726和276是同一重量。枚举每一个是否有被装进轮船即可。
【代码】
#include <cstdio>
int n,c,a[2000],max_w = -1,sum = 0;
bool bo[2000];
void input_data()
{
scanf("%d %d",&n,&c);
for (int i = 1;i <= n;i++)
scanf("%d",&a[i]);
for (int i = 1;i <=1999;i++) //一开始所有的集装箱都能用。都能装
bo[i] = true;
}
void sear_ch(int x)
{
sum += a[x]; //累加重量
bo[x] = false; //标记这个物品已经被用过
if (sum > c) //如果总重量超过最大值 就返回上一层
{
sum-=a[x];
bo[x] = true;
return;
}
if (sum >max_w) //如果最大值能更新就更新
max_w = sum;
for (int i =x+1;i <= n;i++) //因为是组合问题 所以从x+1开始扫描
if (bo[i])
sear_ch(i);
bo[x] = true; //回溯
sum -= a[x];
}
void get_ans()
{
for (int i = 1;i <= n;i++)
sear_ch(i);
}
void output_ans()
{
printf("%d",max_w);
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
get_ans();
output_ans();
return 0;
}