#include <iostream>
using namespace std;
int main()
{
int n,v,a[50][2],dp[50][50];
cin>>n>>v;
for(int i=1;i<=n;i++)cin>>a[i][0]>>a[i][1];
for(int i=1;i<=n;i++)
{
for(int j=0;j<=v;j++)
{
for(int k=0;j-k*a[i][0]>=0;k++)
{
dp[i][j]=max(dp[i][j],dp[i-1][j-k*a[i][0]]+k*a[i][1]);
}
}
}
cout<<dp[n][v];
}
動態規劃-----完全揹包
題目
有N種物品和一個容量爲V的揹包,每種物品都有無限件可用。
第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。
分析:仔細看這道題目,我們會發現,這個題目與簡單的揹包問題,有一個區別便是 簡單的揹包的問題,物品只能取一次,而這個便不規定取得次數,僅此區別
那麼我們針對這個區別如何在 以前原來的基礎上做一添加呢? 答案很簡單就是在以前的狀態轉移方程式上做一個小小的修改
w[i]爲i編號的重量 v[i]爲i編號的價值
01揹包: dp[x][y]=max(dp[x-1][y],dp[x-1][y-w[i]]+v[i]);
現在的揹包問問題的: dp[x][y]=max(dp[x-1][y-w[i]*k]+v[i]*k|k屬於區間[0,y-w[i]*k>=0]);
只是在原有的基礎上多了一個變量k 那麼這道題目我們就十分明瞭了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.