Leetcode 逆序滾動陣列 分類01揹包

2021-10-09 23:47:15 字數 1153 閱讀 7563

01揹包是經典的動態規劃,其研究每乙個揹包是否加入到解中,即:

dp[k][n]  表示分析到第k個揹包時,若有n容量能獲取的最大價值

dp[k][n]=max(dp[k-1][n],dp[k-1][n-cost]+value)

01揹包由於每一次只會使用到k-1的結果,可以考慮採取滾動陣列進行空間優化

dp[n]=max(dp[n],dp[n-cost]+value)  注意n逆序方式從最大值向=>1 進行迭代計算
每一輪分析第k個揹包,那麼已有的dp陣列存放的是第k-1輪計算結果

採取逆序填充,確保dp[n-cost]為上一輪結果,因為每乙個揹包最多取一次

時間限制 :1sec / 空間限制: 256mb

牛妹是一家口罩廠家的老闆,由於現在疫情嚴重,牛妹想重新分配每條生產線上的人數來使得能生產的口罩最多。

牛妹所在的公司一共有mm名員工,nn條生產線(0.....n-1),每條生產線有strategy[i].size種人數安排策略。例如:33個人在aa生產線上,aa生產線每天生產88個口罩;55個人在aa生產線上,每天aa生產線能生產1515個口罩。

牛妹想知道通過合理的策略安排最多每天能生產多少口罩?(可以不用將所有員工都分配上崗,生產線可以選擇閒置)

給定n,mn,m,strategystrategy陣列

strategy[i][j].x表示人數,strategy[i][j].y表示能生產的口罩數

返回每天最大的口罩生產數量

示例1複製

3,5,[[(1,3),(2,4)],[(3,4),(4,4)],[(8,8)]]
複製

8
思路:

分類01揹包問題,指的是將揹包分成幾大類,每次只能在一大類中最多取乙個。那麼解決思路為:

每一輪研究一大類,分析每一大類中的最大值。採取逆序滾動陣列降低空間開銷。

int producemask(int n, int m, vector>& strategy)      

}}

}return dp[m];//最後dp[m]即為所求

}

leetcode之陣列的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數 利用歸併排序求逆序對即可 在合併陣列的時候 當右邊的陣列大於左邊的陣列的時候答案就加上左邊還未進行比較的陣列個數即可mid i 1.簡要 如下 class solution e...

PHP陣列分頁,PHP陣列分頁操作

php陣列分頁實現方法,php陣列操作 arr test array array number 1 datalist 111datalist array number 2 datalist 222datalist array number 3 datalist 333datalist array n...

2 18 陣列分割

題目概述 有乙個沒有排序,元素個數為2n的正整數陣列。要求把它分割為元素個數為n的兩個陣列,並使兩個子陣列的和最接近。假設陣列a 1.2n 所有元素的和是sum。模仿動態規劃解0 1揹包問題的策略,令s k,i 表示前k個元素中任意i個元素的和的集合。顯然 s k,1 s k,k s k,i s k...