hdu1171解題報告

2021-07-03 07:10:28 字數 1114 閱讀 3271

題意大概是:求把總價值分為兩個數,使這兩個數接近相等,而且這兩個數必須由所有裝置中的其中幾種裝置價值構成,並先輸出比較大的數,再輸出另乙個數。

這是一道多重揹包的題目,雖然物體本身只有**這乙個屬性~~但是可以把這一種屬性看做兩種屬性(**折半之後,相當於有個屬性的限制了),**本身當兩種屬性,其次多重揹包在空間和時間都比較充裕的情況下可以轉換為01揹包.

狀態量設為d[i][j]意思是拿第i個物體時,揹包的剩餘容量是j,接下來的揹包的最大容量。

狀態轉移方程是: d[j]=max(d[j],d[j-val[i]]+val[i])                        (我拿一維陣列做的,lrj的書下有介紹「滾動陣列」)

邊界時當i==n時,d[i][j]=0(揹包不用裝滿),這一點很重要,因為查詢的數不一定為總數的一邊,所以j可以不為0/*13892580    2015-06-14 21:30:34 

/*13892580    2015-06-14 21:30:34    accepted    1171    1014ms    2596k    952 b    g++    hehze*/

/*好題啊~~*/

#include

#include

#include

#include

using namespace std;

int d[250100];

int val[5100];

int main()

{int n;

while(cin>>n)

{if(n<0)  break;

memset(d,0,sizeof(d));

memset(val,0,sizeof(val));

int m=0,sum=0;

for(int i=0;i>a>>b;

sum+=(a*b);

for(int i=0;i=1;i--)

for(int j=sum/2;j>=0;j--)

if(j>=val[i]) d[j]=max(d[j],d[j-val[i]]+val[i]);//這max是讓他更接近sum/2,小於的那邊

cout<

hdu1171 多重揹包模板題

最近重新開始學dp,今天做到多重揹包這題,自己寫了乙個 感覺自己確實進步點了 嘻嘻。但是我沒看清題意n 0 退出迴圈,我wa 了無數次。下 面是自己寫的 include include include include include include include include include i...

HDU 1171 母函式 揹包(待補)

分家,共有n種財產,每種財產價值v,數量為m,平分給a b機構 原題講的是學院 並且a所得不小於b。求a和b可以分到的值。算是比較經典 的題目。講真,要不是這題在老師分在母函式裡我想不到用這個。我目前對母函式的理解是,求出所有target的組合方法。例如hdu1028,1398的題來說,target...

hdu3790解題報告

這裡起點和終點都是確定的,唯一有點小麻煩 也算不上什麼麻煩 就是這裡的權值有兩個,錢和路長,題目要求選擇最短路,對於一樣長度的路選擇錢最少的路.那麼我們每次就對路長鬆弛,對於路長一樣的在對錢鬆弛.不懂鬆弛操作的很抱歉 ac 840k 109ms include includeusing namesp...