動態規劃 —— 背包問題一 專項研究學習
阿新 • • 發佈:2017-10-02
++ clu ace tro 問題 clas text 狀態 sca
背包問題OJ地址:http://oj.noi.cn/oj/#main/show/1159
1159. 背包問題一 (Standard IO)
時間限制: 1000 ms 空間限制: 262144 KB 具體限制
題目描述
有個背包可承受重量N,現有T件物品
每件物品重量為Wi,價值為Vi ,每件物品只有一個,這個背包可以裝載物品的最大價值是多少?
輸入
一行,N T 之間用空格隔開。
後面t行,每行:重量Wi,價值Vi。
輸出
這個背包可以裝載物品的最大價值。
樣例輸入
100 5
77 92
22 22
29 87
50 46
99 90
樣例輸出
133
數據範圍限制
N<=1000,T<=100,1<=Wi,Vi<=100
/* 問題: 有個背包可承受重量N,現有T件物品. 每件物品重量為Wi,價值為Vi. 每件物品只有一個. 這個背包可以裝載物品的最大價值是多少? */ #include <iostream> #include <cstdio> using namespace std; //定義三個數組, W為不同物體的 重量,V為不同物體的價值,F為不同稱量背包的總價值; int W[2005],V[2005],F[2005]; int main() { /*-------定義變量並讀入數據------------*/ int N,T; scanf("%d %d",&N,&T);for(int i=1;i<=T;i++) scanf("%d %d",&W[i],&V[i]); /*--------------動態規劃----------------*/ for(int i=1;i<=T;i++)//遍歷每一件物品 for(int j=N;j>=W[i];j--)//不斷地嘗試 放置每一件物品 { F[j]=max(F[j-W[i]]+V[i],F[j]);//狀態轉移方程: F[j]=max(F[j-W[i]]+V[i],F[j]) 刷新最大背包的當前最大價值;/*詳細分析此處: 這裏使用了動態規劃算法,其實也就是記憶化搜索, 就是把F【】中沒搜一次都記錄在F這個數組中, 以後再次遞歸或遞推時,就不需要 再次的計算, 直接從數組中查詢是否存在,如果存在,直接調用即可; */ } /*----------------輸出解答-------------*/ cout<<F[N]<<endl; return 0; } //PS:2017年10月2日19:02:02
動態規劃 —— 背包問題一 專項研究學習