2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
एकम्,द्विविधा सरणी
अतः पुनरावर्तनीय सूत्र: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - भार[i]] + मूल्य[i]);
2. आरम्भीकरणम्
(1) dp[i][j] इत्यस्य परिभाषातः आरभ्य यदि पृष्ठपुटस्य क्षमता j 0 अर्थात् dp[i][0] भवति तर्हि कोऽपि द्रव्यः चयनितः न भवतु तर्हि पृष्ठपुटस्य कुलमूल्यं भवितुमर्हति ० ।
(2) राज्य संक्रमण समीकरण dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - भार[i]] + मूल्य[i]); दृष्टं यत् i i-1 तः व्युत्पन्नः अस्ति, अतः i 0 भवति चेत् तस्य आरम्भः अवश्यं करणीयः ।
dp[0][j], अर्थात्: i 0 भवति, यदा 0 सङ्ख्यां संग्रहयति तदा अधिकतमं मूल्यं यत् प्रत्येकस्य क्षमतायाः बैकपैक् संग्रहीतुं शक्नोति ।
तदा स्पष्टं भवति यत् यदा j < भारः[0] भवति तदा dp[0][j] 0 भवितुमर्हति, यतः पृष्ठपुटक्षमता 0 सङ्ख्यायुक्तस्य द्रव्यस्य भारात् लघुः भवति ।
यदा j >= weight[0], dp[0][j] मूल्य[0] भवितुमर्हति, यतः बैकपैक् क्षमता 0 द्रव्यसङ्ख्यां धारयितुं पर्याप्तं भवति ।
- for (int j = 0 ; j < weight[0]; j++) {
- dp[0][j] = 0;
- }
- // 正序遍历
- for (int j = weight[0]; j <= bagweight; j++) {
- dp[0][j] = value[0];
- }
(३) अन्यः उपलिपिः आरम्भः : १.
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - भार[i]] + मान[i])
dp[1][1] = max(dp[0][1], dp[0][1- weight[i]] + value[i]) वामभागे तस्य उपरि च भवितुमर्हति,
अतः, इदं प्रारम्भं कृतं भवितुमर्हति तथा च यत्किमपि मूल्यं सेट् कर्तुं शक्यते, सुविधायै, पूर्वनिर्धारितरूपेण 0 इति आरभ्यते ।
2. एकविमीय (रोलिंग सरणी) .
1. एकआयामी dp सरणीयां dp[j] इत्यस्य अर्थः अस्ति यत् j क्षमतायुक्तः पृष्ठपुटः dp[j] इत्यस्य अधिकतममूल्येन वस्तूनि वहितुं शक्नोति ।
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
2. आरम्भीकरणम्
(1) dp[0]=0, यतः 0 क्षमतायुक्तेन पृष्ठपुटेन वहितानाम् वस्तूनाम् अधिकतमं मूल्यं 0 भवति ।
(2) द्रव्याणां मूल्यं 0, 0 इत्यस्मात् अधिकं भवति इति कल्पयतु।यथा प्रारम्भिकमूल्येन अधिलेखनं न भवति, सो दप्सरणी आरम्भीकरणयदा , ते सर्वे प्रारम्भे 0 भवन्ति
3. भ्रमणक्रमः
विपरीतक्रमेण भ्रमणं कुर्वन्तु
व्याख्या १ : सूचीयाः अन्ते मूल्यं पूर्वस्तरं भ्रमित्वा प्राप्तेन पूर्वमूल्येन सह तुलनां कृत्वा निर्धारयितुं आवश्यकम् ।
व्याख्या 2: प्रत्येकस्य पृष्ठपुटस्य कृते केवलम् एकः 01 पृष्ठपुटः अस्ति यत् एतत् पुटं स्थापितं वा न वा पूर्वपुटस्य स्थितिः सम्बद्धः अस्ति दक्षिणः वर्तमानपुटस्य लम्बितस्थितिः अस्ति, सङ्केते दक्षिणभागे स्थितस्य सङ्ख्यायाः निर्धारणाय वामभागे स्थिता संख्या आवश्यकी भवति, अतः दक्षिणभागे स्थिता संख्यायाः गणनायाः पूर्वं नष्टुं न शक्यते
व्याख्या ३ : द्वयोः आयामयोः कृते मम प्रत्येकस्य नूतनस्य dp सङ्ख्यायाः परिणामाः उपरि वामतः आगच्छन्ति वस्तुतः एकस्मिन् आयामे एतत् भवितुम् अर्हति, परन्तु एकस्मिन् आयामे यदि अद्यापि वामतः दक्षिणतः अस्ति तर्हि my actual left आकृतयः अद्यतनाः कृताः ( वामपक्षः “मूलः” वामपक्षः नास्ति!अनेन किञ्चित् द्विगुणं गणना भविष्यति ), यद्यपि शीर्षं अद्यापि मूलशिखरं भवति तथापि प्राप्ता संख्या अशुद्धा भवति ।तथा च यदि वयं backpack layer (inner layer) इत्यत्र दक्षिणतः वामपर्यन्तं गच्छामः तर्हि वामे स्थितः element सर्वदा एव करिष्यतिमम पूर्वसञ्चालनात् नूतनमूल्यैः सह अधिलिखितं न भविष्यति ।, येन सम्यक् मूल्यं प्राप्तुं शक्यते ।
3. अनुप्रयोगः
1. केवलं सकारात्मकपूर्णाङ्काः युक्तं अरिक्तं सरणी दत्तम्। किं एतत् सरणीं द्वयोः उपसमूहयोः विभक्तुं शक्यते येन उपसमूहद्वये स्थितानां तत्त्वानां योगः समानः भवति?
नोटः- प्रत्येकस्मिन् सरणीयां तत्त्वानि 100 अधिकं न भविष्यन्ति तथा च सरणीयाः आकारः 200 अधिकः न भविष्यति
उदाहरणम् १ : १.
विश्लेषणं कुर्वन्तु : १.
द्रव्यं i, .
भारः nums[i], मूल्यं nums[i] अपि, पृष्ठपुटस्य आयतनं च sum/2 अस्ति ।
०१ पृष्ठपुटस्य सदृशम्
राज्य संक्रमण समीकरण : १.
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
- // 开始 01背包
- for(int i = 0; i < nums.size(); i++) {
- for(int j = target; j >= nums[i]; j--) {
- dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
- }
- }
- // 集合中的元素正好可以凑成总和target
- if (dp[target] == target) return true;
2. तत्र शिलाराशिः भवति, प्रत्येकस्य शिलायाः भारः धनात्मकः पूर्णाङ्कः भवति ।
प्रत्येकं गोलं यत्किमपि शिलाद्वयं चित्वा एकत्र भग्नं कुर्वन्तु। कल्पयतु पाषाणानां भाराः x, y च, x <= y च । अथ मर्दनस्य सम्भाव्यफलं यथा ।
यदि x == y तर्हि द्वयोः शिलायोः पूर्णतया मर्दनं भविष्यति;
यदि x != y, तर्हि x भारस्य शिला सर्वथा भग्नः भविष्यति, y भारस्य शिलायाः yx इत्यस्य नूतनं भारं भविष्यति ।
अन्ते अधिकतया एकः एव शिला अवशिष्टः भविष्यति । अस्य शिलायाः लघुतमं भारं प्रत्यागच्छति । यदि शिलाः न अवशिष्टाः सन्ति तर्हि 0 प्रत्यागच्छति ।
उदाहरण:
विश्लेषणम् : १.
शिलाः समानभारस्य द्वयोः राशौ विभज्य, यथा लघुतमः अवशिष्टः शिलाः टकरावस्य अनन्तरं
ततः पाषाणराशिद्वये विभज्य एकस्य पाषाणराशिस्य कुलभारः dp[target], अन्यस्य राशीयाः कुलभारः योगः - dp[target] भवति ।
लक्ष्यस्य गणनायां target = sum / 2 यतः तत् गोलं भवति, अतः sum - dp[target] dp[target] इत्यस्मात् अधिकं वा समं वा भवितुमर्हति ।
अथ सङ्घर्षानन्तरं अवशिष्टस्य पाषाणस्य न्यूनतमं भारं (योगः - dp[target]) - dp[target] ।
- for (int i = 0; i < stones.length; i++) {
- //采用倒序
- for (int j = target; j >= stones[i]; j--) {
- dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);
- }
- }
- //结果
- sum - 2 * dp[target];
उद्धृतम् : १.कोड यादृच्छिक टिप्पणियाँ