演算法基礎--動態規劃(筆試記錄)
阿新 • • 發佈:2018-11-08
#include<iostream> using namespace std; int main() { //輸入部分 //輸入寶箱的個數n,和現在還剩餘的魔法值w int n,w; cin>>n>>w; //int n = 5,w = 10; int x,y; //p[i]為第i個寶箱所需要的魔法值 //v[i]為第i個寶箱裡面的金幣數 int p[n+1]; int v[n+1]; p[0] = 0; v[0] = 0; //輸入第i個寶箱對應的金幣數和所需魔法值 for(int i = 1;i<=n;i++){ cin>>y>>x; v[i] = y; p[i] = x; } int Preresult[w+1]; int t; //先賦值 for(int i = 1;i <= w;i++){ if(i<p[1]) { Preresult[i] = 0; } else{ Preresult[i] = v[1]; } } //使用動態規劃的方法,使區域性最優從而達到整體最優 int result[w+1] = {0}; Preresult[0] = 0; //n為寶箱的個數 for(int i = 2;i<=n;i++){ //w為人數 for(int j=1;j<=w;j++){ //總人數-一個寶箱需要的魔法值 if(j<p[i]){ //賦予它一個相對來說特別小的數 t = -123456; } else{ t = Preresult[j-p[i]]; } result[j] = max(Preresult[j],t+v[i]); } for(int k = 1;k<=w;k++){ Preresult[k] = result[k]; } } cout<<result[w]<<endl; }