【問題描述】
小沐同學確信所有問題都有個多項式時間演算法,為了證明,他決定自己去當一次旅行商,在上路之前,小 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 0
1 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;
這道題是乙個超級加強揹包問題。這個問題要分3部分來思考(就是3種揹包分開想),然後問題就簡單了,重點就落在了第一種物品了,我這裡採取的方法是直接暴力列舉:第j大的那種,然後列舉j。
詳細**如下:
#include
#include
#include
#include
using namespace std;
const int maxn=105;
struct shu
a[maxn];
int n,m;
long long d[maxn][2005]=;
intread()
returnx;}
void init()
if(a[i].id==2)
if(a[i].id==3)
}}int main()
}if(a[i].id==2)
for(int j=m;j>=0;j--)
for(int k=0;k<=a[i].c&&k*a[i].b<=j;k++)
if(a[i].id==3)
for(int j=0;j<=m;j++)
}coutreturn
0;}
複賽模擬試題 求和
問題描述 計算 1 b 2 b a b 的和除以 10000 的餘數 輸入格式 第一行乙個整數n,表示有n組測試資料 接下來n行,每行包含兩個正整數a和b。輸出格式 n行,對應輸入的答案 輸入樣例 1 2 3 輸出樣例 資料範圍 30 的資料滿足 1 n 10,a,b 1000 100 的資料滿足 ...
複賽模擬試題 河床
問題描述 地理學家們經常要對一段河流進行測量分析。他們從上游開始向下游方向等距離地選擇n n 30000 個點測量水位深度。得到一組資料a1,a2,an,回到實驗室後資料分析員根據需要對資料進行分析,發掘隱藏在資料背後的規律。最近,烏龍博士發現某種水文現象與河床地勢有關,於是他指示分析員要找出一段河...
HGOI 物品選取
小x確信所有問題都有個多項式時間演算法,為了證明,他決定自己去當一次旅行商,在上路之前,小x需要挑選一些在路上使用的物品,但他只有乙個能裝體積為 m 的揹包。顯然,揹包問題對小x來說過於簡單了,所以他希望你來幫他解決這個問題。小x可以選擇的物品有 n 樣,一共分為甲乙丙三類 1甲類物品的價值隨著你分...