NYOJ 311 完全揹包(揹包問題)

2021-07-31 12:15:00 字數 1497 閱讀 3758

problem description

直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價值總和是多少。如果不能恰好裝滿揹包,輸出no

input

第一行: n 表示有多少組測試資料(n<7)。接下來每組測試資料的第一行有兩個整數m,v。 m表示物品種類的數目,v表示揹包的總容量。(0output

對應每組測試資料輸出結果(如果能恰好裝滿揹包,輸出裝滿揹包時揹包內物品的最大價值總和。 如果不能恰好裝滿揹包,輸出no)

sample input

2

1 52 2

2 52 2

5 1

sample output

no

1

題目思路

完全揹包問題,完全揹包不同於01揹包的地方是物品有無限個。一般的完全揹包問題會問在一定容量揹包中所能達到的最大價值。這道題目要求的雖然也是揹包中的最大價值,但是有乙個前提是揹包被裝滿。可以肯定的是,當揹包中物品達到最大價值時,揹包不一定裝滿。而揹包裝滿也不一定是最大價值。這裡用到了乙個技巧。初始化dp[0] 為0,其餘都為較大的負數。dp[j]表示的是揹包容量為j時,能達到的最大價值(前提是揹包裝滿)。狀態轉移方程還是一樣的dp[j] = max(dp[j],dp[j-v[i]]+w[i]),試想,如果該揹包能被裝滿,即j-v[i] = k*v[i](0<=k<=c/v[i]) 。由狀態轉移方程的方向,我們可以確定能裝滿的揹包的價值都不為負數。舉個例子題目中的

體積 價值

物品1:   2   2

物品2:   5   1

dp[0] = 0;

dp[2] = max(dp[2], dp[2-2]+2) = 2; dp[3] = max(dp[3], dp[3-2]+2) = -inf+2; dp[4] = max(dp[4], dp[4-2]+2) = 4; dp[5] = -inf+4

dp[5] = max(dp[5], dp[5-5]+1) = 1;

因此,如果能裝滿,那麼我們所求出的數一定是非負數。否則無法裝滿,則輸出no。

題目**

#include #include #include #include #include #include #include #include #include using namespace std;

int n, v, n;

int c[2005], w[2005];

int dp[50005];

int main()

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

} if(dp[v] < 0)

puts("no");

else

printf("%d\n",dp[v]);

} return 0;

}

NYOJ 311 完全揹包 揹包問題

完全揹包 include include includestruct sb ok 2005 int main memset yi,999999,sizeof yi 除yi 0 為0外全部初始化為負無窮。yi 0 0 scanf d d n,v for a 1 a n a scanf d d ok a...

nyoj311 完全揹包 完全揹包

完全揹包 時間限制 3500 ms 記憶體限制 65535 kb 難度 4 描述 直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,...

完全揹包 nyoj 311

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價...