POJ1015和uva323動態規劃01揹包擴充套件

2021-08-04 01:47:28 字數 1248 閱讀 7579

題解:一開始以為這個符合最優子結構的動態規劃,但是後來看了別人的題解發現不符合最優子結構,無法將所有的狀態轉移。因為可能我選了前面這個但是如果我選另外乙個加上本身更優,這個時候選擇沒辦法選擇另外乙個因為已經消失了,這個時候可以用01揹包的思想做並且用乙個vector陣列記錄一下路徑,用陣列第二維20*m是表示絕對差0兩邊表示絕對值差1.2.。。3.。。

這樣就可以把每乙個狀態轉移過去了。

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int mx = 205;

const

int inf = 0x3f3f3f3f;

int dp[mx][4*mx];

vector

pre[mx][4*mx];

int de[mx],su[mx];

int main()

memset(dp,-1,sizeof(dp));

int f = 20*m;

dp[0][f] = 0;

for(int i = 1; i <= n; i++)

for(int j = m-1; j >= 0; j--)

for(int k = 0; k < 2*f; k++)

if(dp[j][k]!=-1&&(k+de[i]>=0&&k+de[i]<=2*f))

}int i;

for(i = 0; dp[m][f+i] == -1&&dp[m][f-i] == -1; i++);

int temp = dp[m][f+i]>dp[m][f-i]?f+i:f-i;

int sum1 = (dp[m][temp]+temp-f)/2;

int sum2 = (dp[m][temp]-temp+f)/2;

printf("jury #%d\n",casei++);

printf("best jury has value %d for prosecution and value %d for defence:\n",sum1,sum2);

for(int i = 0; i < m; i++)

printf(" %d",pre[m][temp][i]);

printf("\n\n");

}return

0;}

poj 1015 大力dp,01揹包變種

題意不想說了,人寫吐了,其實難也不能說很難,就是蠻繞的。ac include include include include include include include include include define inf 0x3f3f3f3f define endl n define pb p...

01揹包和動態規劃

做了一段時間 做到動態規劃看了幾天演算法書籍。還是沒有深入,學了基本的動態規劃,稍有一點體會,記錄到這裡。揹包是這樣一類問題 在限定總質量前提下,從若干質量 對中,取哪些能使得 最大。動態規劃是一種思想,簡單的說,動態規劃思想就是充分利用對子問題的計算結果來遞推父問題結果。所以,動態規劃具有較高的效...

動態規劃 (01揹包 poj3624 )

關於揹包問題 眾所皆知,這裡講給出關於揹包問題的一些簡介 乙個旅行者準備隨身攜帶乙個揹包 可以放入揹包的物品有n 種 每種物品的重量和價值分別為 wj vj 如果揹包的最大重量限制是 b,怎樣選擇放入揹包的物品以使得揹包的價值最大?題目就是這麼簡單 先思考乙個問題 就是每種物品可以重複選擇,這種要怎...