problem description
直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價值總和是多少。如果不能恰好裝滿揹包,輸出no
input
第一行: n 表示有多少組測試資料(n<7)。接下來每組測試資料的第一行有兩個整數m,v。 m表示物品種類的數目,v表示揹包的總容量。(0output
對應每組測試資料輸出結果(如果能恰好裝滿揹包,輸出裝滿揹包時揹包內物品的最大價值總和。 如果不能恰好裝滿揹包,輸出no)
sample input
21 52 2
2 52 2
5 1
sample output
no1
題目思路
完全揹包問題,完全揹包不同於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。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價...