你現在有乙個揹包,現在每個物品都有體積,價值,顏色三種屬性,求不少於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 轉化...