有趣的揹包。

2021-09-26 23:51:21 字數 1450 閱讀 5608

你現在有乙個揹包,現在每個物品都有體積,價值,顏色三種屬性,求不少於k種顏色

下揹包的最大值。

輸入

輸入第一行為測試樣例組數t(1<=t<=100)。

對於每組資料第一行包含三個正整數n(1<=n<=100),k(1<=k<=5),v(1<=v<=200),分別代表n個物品,想要的顏色種數,揹包的容量。

接下來n行,每行三個正整數ai(1<=ai<=1000),vi(1<=vi<=v),ci(1<=ci<=n),分別代表每個物品的價值,體積,顏色。

輸出

對於每組資料,輸出乙個整數代表揹包能放不少於k種顏色的最大價值。

樣例輸入

35 1 10

3 2 1

5 8 1

7 9 1

1 2 2

2 2 3

5 2 10

3 2 1

5 8 1

7 9 1

1 2 2

2 2 3

5 3 10

3 2 1

5 8 1

7 9 1

1 2 2

2 2 3

樣例輸出87

6其實還是很容易想到在01揹包的基礎上,多加一維用來表示個數,那轉移方程式也可以得到

用dp[i][j]來表示在i個顏色**積是j的情況下,可以獲得價值的最大值,用a[i][j]來表示在第i種顏色**積是j的情況下,可以獲得價值的最大值。那麼dp[i][j]=max(dp[i][j],dp[i-1][j-x]+a[y][x]);

下面是**

#include#define inf 0x3f3f3f3f

using namespace std;

int dp[110][300];//[該種類顏色][體積]

int dp1[110][300];[個數][體積]

int a[110];//價值

int b[110];//體積

int c[110];//顏色

bool vis[110];//標記是否有這個種類的顏色

int main()

}for(int i=0;i<=v;i++)

dp1[0][i]=0;//初始化

int cnt=0;

for(int i=1;i<=n;i++)}}

}int _max=0;

for(int i=k;i<=n;i++)//找出至少k種顏色最大價值

_max=max(_max,dp1[i][v]);

printf("%d\n",_max);

}}

這道題還是很有意思,終於寫出來了,嗚嗚嗚嗚嗚嗚。

to live is to function --xxy專用小尾巴。

有趣揹包問題

其實就是揹包問題的一種應用,至於為什麼起這麼個名字,可以去問問神犇zhhx。問題描述和01揹包幾乎一樣,你有m元錢,有n個物品可供選擇,每個物品都有各自的花費c和價值v,而且每件物品只可以選擇一次,問在花費不超過m元的條件下,最大價值是多少。嗯,就是和普通的01揹包一樣,不同之處在於資料範圍,m,c...

揹包 01揹包,完全揹包,多重揹包

哈哈 01揹包 f i v max 完全揹包 f i v max 多重揹包 f i v max include include include include include define maxn 1000 using namespace std int n,cap int w maxn 重量 花...

揹包學習 多重揹包揹包

有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...