1. 程式人生 > >動態規劃 —— 背包問題一 專項研究學習

動態規劃 —— 背包問題一 專項研究學習

++ 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

動態規劃 —— 背包問題一 專項研究學習