7-6 0-1背包 (20 分)(思路加详解+网格做法+动态规划)Come Baby !!!!!!!!!!!!!!
生活随笔
收集整理的這篇文章主要介紹了
7-6 0-1背包 (20 分)(思路加详解+网格做法+动态规划)Come Baby !!!!!!!!!!!!!!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:題目
給定n(n<=100)種物品和一個背包。物品i的重量是wi,價值為vi,背包的容量為C(C<=1000)。問:應如何選擇裝入背包中的物品,使得裝入背包中物品的總價值最大? 在選擇裝入背包的物品時,對每種物品i只有兩個選擇:裝入或不裝入。不能將物品i裝入多次,也不能只裝入部分物品i。
輸入格式:
共有n+1行輸入: 第一行為n值和c值,表示n件物品和背包容量c; 接下來的n行,每行有兩個數據,分別表示第i(1≤i≤n)件物品的重量和價值。
輸出格式:
輸出裝入背包中物品的最大總價值。
輸入樣例:
在這里給出一組輸入。例如:
結尾無空行
輸出樣例:
在這里給出相應的輸出。例如:
二:思路:
思路:關于如何判斷是動態 規劃,我個人的理解是
如果所求取的結果是(根據某種規則)跳躍性的挑選數據 那么可以判斷為動態規劃
本題思路來源 依然是 《算法圖解》一書
將背包的容量從1開始展開(設為列),將物品按行展開(設為行),
用二維數組存儲 不同容量下的最大價值,每一行只能算上本行和前面的行的物品,二維數組就是網格化的,將一個大問題分解成小問題,
三:來兄弟干了這杯代碼
/*思路:關于如何判斷是動態 規劃,我個人的理解是如果所求取的結果是(根據某種規則)跳躍性的挑選數據 那么可以判斷為動態規劃本題思路來源 依然是 《算法圖解》一書 將背包的容量從1開始展開(設為列),將物品按行展開(設為行),用二維數組存儲 不同容量下的最大價值,每一行只能算上本行和前面的行的物品那么其本質就是(遞推方程):(規定容量的基礎上)上一個單元格的最大價值 VS(當前商品的價值+剩余容量所存儲的價值) */#include<bits/stdc++.h> using namespace std;int main(){int n,c;vector<int>v1,v2;//用v1來存重量,v2來存價值 cin >> n >> c;int MaxVule[n+1][c+1];//物品件為行,背包容量為列(1,2,...c) //將vector容器當中的0為位置占住(因為在二維數組中是從下標為1的開始的)int a1 = 1,a2 = 2;v1.push_back(a1);v2.push_back(a2); for(int i = 1; i <= n; i++){int num1,num2;cin >> num1 >> num2;v1.push_back(num1);v2.push_back(num2);} //二維數組初始化for(int i = 0; i < n+1; i++){for(int j = 0; j < c+1; j++){MaxVule[i][j] = 0;}} // for(int i = 1; i <= n; i++) // cout << v1[i] << ' '; //創建的網格中開始更新數據for(int i = 1; i < n+1; i++){for(int j = 1; j < c+1; j++){if(i == 1){if(v1[i] <= j){MaxVule[i][j] = v2[i]; }}else{//比較上一個單元格的價值 如果比其大就更新//計算本單元格的價值 = 商品的價值 + 剩余空間的價值int value = j - v1[i];if(value >= 0) {int temp = v2[i] + MaxVule[i-1][value];//注意i-1 因為本行已經裝進商品了不可重復裝入 if(MaxVule[i-1][j] < temp){MaxVule[i][j] = temp;}else{MaxVule[i][j] = MaxVule[i-1][j];} }else{//若商品重量大于 j,則直接繼承上一個單元格 MaxVule[i][j] = MaxVule[i-1][j]; }}}} // for(int i = 1; i <= 3; i++){ // for(int j = 1; j <= 4; j++){ // // cout << MaxVule[i][j] << ' '; // } // cout << endl; // }cout << MaxVule[n][c]; } //5 10 //2 6 //2 3 //6 5 //5 4 //4 6//3 4 //1 1500 //4 3000 //3 2000四:知識速遞(如果對本題的vector容器不熟悉的可以學一下哈)
vector的基本用法
加油!陌生的你,You are the best boy!!!
總結
以上是生活随笔為你收集整理的7-6 0-1背包 (20 分)(思路加详解+网格做法+动态规划)Come Baby !!!!!!!!!!!!!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称阿尔特曼遭罢免原因在于 OpenA
- 下一篇: 7-11 租用游艇问题 (15 分)(思