常見的有三種,
一,每組最多取乙個,
一維陣列的偽**
for 所有的組k
for v = v to 0
for 所有的i屬於組k
f[v] = max
注意順序不能寫反,因為要限制每組最多取乙個
二,每組任意取
既然上面的順序是限制每組最多取乙個,那調換一下順序即可,其實就是01揹包。
一維陣列的偽**
for 所有的組k
for 所有的i屬於組k
for v = v to 0
f[v] = max
三,每組至少取乙個
沒見過一維的偽**,
dp[ki}[i}表示當前不選,dp[ki-1}[i-b[ki}}+c[ki}表示這是第乙個選,
dp[ki}[i-b[ki}}+c[ki}表示再在這一組中選。
初始化時記得ki==0,賦值0,
其他賦值-inf
dp[ki}[i}=max(dp[ki}[i},dp[ki-1}[i-b[ki}}+c[ki},dp[ki}[i-b[ki}}+c[ki})
//分開寫時要注意順序!!!
下面這道題是這三種的綜合,由於第三種情況要用二維寫,所以就都用二維寫。
if(type==0)
for(int i=0;i
<=t;i++) dp[ni]
[i]=-inf;
else
for(int i=0;i
<=t;i++) dp[ni]
[i]=dp[ni-1]
[i];
上面**是將狀態從上乙個組傳遞到當前組。
#include
#include
#include
#include
#include
#include
#include
#include
#define msc(x) memset(x,-1,sizeof(x))
#define ms(x) memset(x,0,sizeof(x))
typedef
long
long ll;
using
namespace
std;
const
int inf=0x7fffffff;
int dp[102][102];
int main(int argc, char
const *argv)}}
else
if(type==1)}}
else}}
}if(dp[n][t]<0) puts("-1");
else
printf("%d\n",dp[n][t] );
}return
0;}
HDU 3535 揹包綜合
題意 給3種揹包,一種是至少裝乙個,一種是最多裝乙個,一種任意。首先要對一維狀態的原始揹包很熟悉才可以。此處的i代表滾動的揹包型別。1.任意的話就是01揹包 初始化 dp i j dp i 1 j dp i j max dp i j w i 存在.2.最多裝乙個,就是比較替換。初始化 dp i j ...
hdu 3535 AreYouBusy 混合揹包
題意 有三種任務,至少完成乙個,至多完成乙個,任意完成。現在給出k組任務,每組任務都屬於三種任務的一種。每個任務都會消耗時間,獲得幸福感。求時間t內的最大滿足感。三種揹包的混合。還是考察對揹包問題的理解。顯然一維已經滿足不了要求了,我們設d k j 代表第k組容量為j時獲得的最大滿足感。可以明顯比較...
題解 hdu3535 混合揹包
題目鏈結 思路摘抄自大佬部落格 首先如果存在最優解,我們可以互換不同工作集合的處理順序,依然能得到最優解.那麼我們下面只需要處理每個單獨的工作集合即可.令dp i j x表示處理完前i組工作集,所花時間 j時的快樂值為x。每得到一組工作就進行一次dp,所以dp i 為第i組的結果。下面對三種情況進行...