FLY的揹包

題目描述

FLY又要出行了,這回他帶上了k只揹包,一樣的,他有n件物品想要帶出去,每件物品的重量爲a[i](而且是不可分的)。 因爲FLY是個輕度完(qiang)美(po)主(zheng)義(huan)者(zhe)【假的】,他但願每隻揹包的重量都可以相等。 因而你須要幫助FLY計算出每隻揹包最大可以帶的重量。code

·(其實只有這句話是有用的:他但願每隻揹包的重量都可以相等。 因而你須要幫助FLY計算出每隻揹包最大可以帶的重量。其餘話都沒用,qwq )

輸入

第一行兩個數字n,k,表明物品個數與揹包個數。
第二行n個數字表明每件物品的重量。
n<=10,每隻揹包重量不大於20. 【DFS的範圍呵呵呵qwq】class

輸出

​ 一個數字,即每隻揹包能分配獲得的最大重量。搜索

樣例輸入

10 4
3 5 3 7 4 3 5 2 8 1

樣例輸出

10

提示

樣例解釋:
10 4
3 5 3 7 4 3 5 2 8 1co

10件物品分4個揹包,每一個揹包重量同樣,最大能夠分配重量爲10
揹包1:3 7
揹包2:3 3 4
揹包3:5 5
揹包4:2 8數字

思路

​ 看看就知道是搜索,不要當作揹包哦,由於這道題他說他但願每隻揹包都要相等,若是其中一隻不相等的就不能選了。這樣就能幹了揹包。。。枚舉

​ 搜索實際上是能夠的,正解也是搜索。不停的去枚舉,每次的話要麼選,要麼不選。return

​ 選也能夠分爲一些狀況:當前沒選的,和雖然選了,可是仍是要用的那一種揹包。操做以後也要標記一些。而後減掉揹包重量。在繼續搜索便可。void

​ 給出關鍵代碼:

if(fg == 0) {
        if(t == 1) {
            flag = 1;
            return;
        }
        dfs(1 , gu , t-1);
        return;
    }

​ 不選的狀況:當沒標記的時候也要作,也要把這個容量給減掉。繼續搜索。

​ 給出關鍵代碼:

if(!f[i]) {
        f[i] = 1;
        dfs(i+1,fg-a[i],t);
        f[i] = 0;
    }

​ 而後就繼續搜索便可。

dfs(i+1,fg,t);

關鍵搜索部分:

gu爲答案,fg爲揹包重量,t爲個數。

void dfs(int i,int fg,int t) {
    if(fg < 0 || flag || i>n+1)return;
    if(fg == 0) {
        if(t == 1) {
            flag = 1;
            return;
        }
        dfs(1 , gu , t-1);
        return;
    }
    if(!f[i]) {
        f[i] = 1;
        dfs(i+1,fg-a[i],t);
        f[i] = 0;
    }
    dfs(i+1,fg,t);
}

提示:搜索是惟一打法。

相關文章
相關標籤/搜索