1. 程式人生 > >演算法基礎--動態規劃(筆試記錄)

演算法基礎--動態規劃(筆試記錄)

#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;
	
 }