裝載問題 回溯法

2021-08-11 17:06:55 字數 1066 閱讀 3713

描述

有一批共n個貨櫃要裝上艘載重量為c的輪船,其中貨櫃i的重量為wi。找出一種最優裝載方案,將輪船盡可能裝滿,即在裝載體積不受限制的情況下,將盡可能重的貨櫃裝上輪船。

輸入

由檔案load.in給出輸入資料。第一行有2個正整數n和c。n是貨櫃數,c是輪船的載重量。接下來的1行中有n個正整數,表示貨櫃的重量。

輸出

將計算出的最大裝載重量輸出到檔案load.out。

樣例輸入

5 10

7 2 6 5 4

樣例輸出

10分析:這個題可以運用「回溯」演算法來進行運算,目的是算出輸入陣列裡不超過目標值的最大值。具體過程如下:

1、定義乙個和的變數,記錄從第乙個開始和下乙個數的和。

2、若和大於目標值,則「捨去」第二個值並進行下乙個求和。

tip:這裡求和需要進行從大到小的排序,若是沒有排序,則有可能會得不到或捨去一些值,最後得到的答案是錯誤的。

3、回溯。

下面貼一下**:

#include

#include

#include

using

namespace

std;

int n,c;

int a[1000];

int sum=0,ans=0;

void pr()

void dfs(int x)

if(i==1)

}dfs(x-1);

}int main()

sort(a+1,a+n+1);//這裡的排序很重要

dfs(n);

printf("%d",ans);

return

0;}

感謝@人殤物已非的指導以及所給出的優化**:

if(sum+a[i]>c)

裝載問題 回溯法

有n個貨櫃要裝上2艘載重量分別為c1和c2的輪船,其中貨櫃i的重量為wi,且 問題 是否有乙個合理的裝載方案,可將這n個貨櫃裝上這2艘輪船?如果有,找出一種裝載方案。例如 當n 3,c1 c2 50 1 若w 10,40,40 可將貨櫃1和貨櫃2裝上第一艘輪船,而將貨櫃3裝上第二艘輪船 2 如果w ...

回溯法 裝載問題

有n個貨櫃要裝上載重量為w的輪船,其中貨櫃i的重量為wi。不考慮貨櫃體積的限制,現在要將若干貨櫃裝上輪船,使他們的總重量為w,如果總重量相同要盡可能的使用少的貨櫃。有n個貨櫃要裝上載重量為c1 c2的輪船,其中貨櫃i的重量為wi。問兩艘輪船能否裝下所有貨櫃。深搜所有情況,重點是要剪枝。題目一剪枝條件...

裝載問題 回溯法

有一批共 n n n 個貨櫃要裝上艘載重量為 c c c 的輪船,其中貨櫃 i i i 的重量為 w i wi wi。找出一種最優裝載方案,將輪船盡可能裝滿,即在裝載體積不受限制的情況下,將盡可能重的貨櫃裝上輪船。第一行有 2 個正整數 n n n 和 c c c。n n n 是貨櫃數,c c c ...