【問題描述】
小沐同學確信所有問題都有個多項式時間演算法,為了證明,他決定自己去當一次旅行商,在上路之前,小 x 需要挑選一些在路上使用的物品,但他只有乙個能裝體積為 m 的揹包。顯然,揹包問題對小沐來說過於簡單了,所以他希望你來幫他解決這個問題。
小沐可以選擇的物品有 n樣,一共分為甲乙丙三類:
1.甲類物品的價值隨著你分配給他的揹包體積變化,它的價值與分配給它的體積滿足函式關係式,v(x) = a*x^2-b*x,x表示分配給該物品的體積,為非負整數,a,b是每個甲類物品的兩個引數。注意每個體積的甲類物品只有乙個。
2.乙類物品的價值 a和體積 b都是固定的,但是每個乙類物品都有個引數c,表示這個物品可供選擇的個數。
3.丙類物品的價值 a和體積 b也是固定的,但是每個丙類物品可供選擇的個數都是無限多個。
你最終的任務是確定小沐的揹包最多能裝有多大的價值上路。
【輸入格式】
第一行兩個整數 n,m,表示揹包物品的個數和揹包的體積;
接下來 n行,每行描述乙個物品的資訊。第乙個整數 x,表示物品的種類:
若 x 為1表示甲類物品,接下來兩個整數 a,b,為a類物品的兩個引數;
若 x 為2表示乙類物品,接下來三個整數 a,b,c。a表示物品的價值,b表示它的體積,c 表示它的個數;
若 x 為3表示丙類物品,接下來兩個整數a,b。a表示它的價值,b表示它的體積。
【輸出格式】
僅一行為乙個整數,表示小 x的揹包能裝的最大價值。
【輸入樣例】
【樣例1】
1 01 1 1
【樣例2】
4 10
2 1 2 1
1 1 2
3 5 2
2 200 2 3
【輸出樣例】
【樣例1】
0【樣例2】
610
【資料範圍】
對於50%的資料,只有乙和丙兩類物品;
對於70%的資料,1<=n<=100, 1<=m<=500,0<=a,b,c<=200;
對於100%的資料,1<=n<=100, 1<=m<=2000,0<=a,b,c<=200;
題目大意:有三種物品,每種物品有著自己不同的屬性,現在求在最後裝載的總體積小於等於m的前提下,揹包內物品的最大價值。這類揹包問題關心的是"選不選"這個問題。是標準的0/1揹包。
演算法:動態規劃o(n*m^2)
設狀態函式f(j)表示在前i個物品中選擇一些裝入揹包,在揹包內物品體積和不超過j的前提下,揹包內物品價值的最大值。
先考慮較為簡單的乙類和丙類物品,對於乙類物品i,每一次都可以選0件,選1件...直到選min(a[i].c,j/a[i].b)件。對應狀態f(j-a[i].b)+a[i].a,f(j-2*a[i].b)+2*a[i].a...f(j-min(j/a[i].b,a[i].c)
而丙類物品和乙類物品類似,只是沒有a[i].c的限制。
現在考慮最難的甲類物品,甲類物品的價值隨著指定體積的大小而變化。而當前可指定給甲物品的體積為0(不放)、1......、j
對應狀態f(j)、f(j-1)+a*1^2+b*1、.......、f(0)+a*j^2+b*j。
在三類物品的所有狀態中,取乙個最大的價值,就是所求的f(i,j)
**實現時注意解這種物品種類和屬性較多的題,要注意分類處理,每考慮乙個物品,都應該取迴圈一次j。
最後的答案f(m)
邊界 f(0)=0(不能放任何物品)
#include#include#include#include#include#include#define maxn 105
#define maxm 2005
using namespace std;
typedef long long ll;
int n,m;
struct data
a[maxn];
ll f[maxm];
int main()
; }
if(x==2)
; }
if(x==3)
; }
} f[0]=0;
for(int i=1;i<=n;i++)
if(a[i].x==2)
if(a[i].x==3)
} cout<
xsy1144 選物品 主席樹
題目大意 n 件物品擺成一排,給每個物品定義兩個屬性 a 和 b 兩件物品的 差異度 定義為它們兩種屬性的差的絕對值中較大的乙個。如果要求出一些物品的差異度,我們先定義乙個 理想物品,使它與這些物品中每個物品的差異度的和最小,這些物品的差異度就是這個最小的和。給定 n 個物品和q組詢問,詢問從 l ...
codevs動態規劃 選菜
在小松宿舍樓下的不遠處,有pk大學最不錯的乙個食堂 the farmer s canteen nm食堂 由於該食堂的菜都很不錯,也公道,所以很多人都喜歡來這邊吃飯。the farmer s canteen的點菜方式如同在超市自選商品一樣,人們從乙個指定的路口進去,再從乙個指定的路口出來並付款。由於來...
CODE VS 1025 選菜 揹包
在小松宿舍樓下的不遠處,有pk大學最不錯的乙個食堂 the farmer s canteen nm食堂 由於該食堂的菜都很不錯,也公道,所以很多人都喜歡來這邊吃飯。the farmer s canteen的點菜方式如同在超市自選商品一樣,人們從乙個指定的路口進去,再從乙個指定的路口出來並付款。由於來...