日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++处理一个动态规划的问题

發(fā)布時(shí)間:2023/12/10 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++处理一个动态规划的问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

嗯哼,別人問(wèn)的問(wèn)題,看的我也頭暈,百度了一下動(dòng)態(tài)規(guī)劃,看了看才想起來(lái)該怎么做,今天寫(xiě)了寫(xiě)代碼,實(shí)現(xiàn)了~

要求是遞歸,動(dòng)態(tài)規(guī)劃,想了想這種方法也是最簡(jiǎn)單的~

所謂動(dòng)態(tài)規(guī)劃:把多階段過(guò)程轉(zhuǎn)化為一系列單階段問(wèn)題,利用各階段之間的關(guān)系,逐個(gè)求解。動(dòng)態(tài)規(guī)劃算法通常用于求解具有某種最優(yōu)性質(zhì)的問(wèn)題。在這類問(wèn)題中,可能會(huì)有許多可行解。每一個(gè)解都對(duì)應(yīng)于一個(gè)值,我們希望找到具有最優(yōu)值的解。動(dòng)態(tài)規(guī)劃算法與分治法類似,其基本思想也是將待求解問(wèn)題分解成若干個(gè)子問(wèn)題,先求解子問(wèn)題,然后從這些子問(wèn)題的解得到原問(wèn)題的解。與分治法不同的是,適合于用動(dòng)態(tài)規(guī)劃求解的問(wèn)題,經(jīng)分解得到子問(wèn)題往往不是互相獨(dú)立的。若用分治法來(lái)解這類問(wèn)題,則分解得到的子問(wèn)題數(shù)目太多,有些子問(wèn)題被重復(fù)計(jì)算了很多次。如果我們能夠保存已解決的子問(wèn)題的答案,而在需要時(shí)再找出已求得的答案,這樣就可以避免大量的重復(fù)計(jì)算,節(jié)省時(shí)間。我們可以用一個(gè)表來(lái)記錄所有已解的子問(wèn)題的答案。不管該子問(wèn)題以后是否被用到,只要它被計(jì)算過(guò),就將其結(jié)果填入表中。這就是動(dòng)態(tài)規(guī)劃法的基本思路。(摘自百科)(時(shí)間復(fù)雜度為一個(gè)多項(xiàng)式的復(fù)雜度)

背包問(wèn)題(Knapsack problem)是一種組合優(yōu)化的NP完全問(wèn)題。問(wèn)題可以描述為:給定一組物品,每種物品都有自己的重量和價(jià)格,在限定的總重量?jī)?nèi),我們?nèi)绾芜x擇,才能使得物品的總價(jià)格最高。問(wèn)題的名稱來(lái)源于如何選擇最合適的物品放置于給定背包中。

?

題目如截圖:

?

?

解題思路:

n代表面值

n為1,直接看是否可以整除;

n>1,看在沒(méi)有第n個(gè)面值的時(shí)候多少,然后看有1個(gè)、2個(gè)....j/n個(gè)面值為n的時(shí)候需要幾枚硬幣,取最小值

將這些直接存在數(shù)組中,然后去數(shù)組里的最小值

代碼:

1 #include"header_file.h" 2 using namespace std; 3 4 int coin_num(vector<int> T,int i,int j) 5 { 6 if(i==1) 7 { 8 if(j%T[0]==0) 9 { 10 return j/T[0]; 11 } 12 else 13 { 14 return 9999; 15 } 16 } 17 else 18 { 19 int min; 20 min=coin_num(T,i-1,j); 21 int temp; 22 temp=j/T[i-1]; 23 for(int m=0;m<=temp;m++) 24 { 25 if(min>(m+coin_num(T,i-1,j-m*T[i-1]))) 26 min=m+coin_num(T,i-1,j-m*T[i-1]); 27 28 } 29 return min; 30 } 31 } 32 33 vector<int> all_num(vector<int> T,int j) 34 { 35 vector<int> v; 36 for(int i=0;i<T.size();i++) 37 v.push_back(coin_num(T,i+1,j)); 38 // for(int i=0;i<T.size();i++) //use for test 39 // cout<<v[i]<<" "; 40 //v.push_back(coin_num(T,i+1,j)); 41 return v; 42 } 43 44 int find_min(vector<int> v) 45 { 46 int min=0; 47 for(int i=1;i<v.size();i++) 48 { 49 if(v[min]>v[i]) 50 min=i; 51 } 52 return v[min]; 53 } 54 55 int main(void) 56 { 57 int n; 58 cout<<"input n:"; 59 cin>>n; 60 61 vector<int> T; 62 for(int i=0;i<n;i++) 63 { 64 int temp; 65 cin>>temp; 66 T.push_back(temp); 67 } 68 69 int j; 70 cout<<"input j:"; 71 cin>>j; 72 73 vector<int> v; 74 v=all_num(T,j); 75 int min; 76 min=find_min(v); 77 cout<<"min:"<<min<<endl; 78 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/wswang/p/5112253.html

總結(jié)

以上是生活随笔為你收集整理的C++处理一个动态规划的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。