一、背包问题
1.01背包
1.1 二维01背包
http://xyoj.xynu.edu.cn/problem.php?id=1416
//t[i]->代价 time->可承受最高代价 p[i]->需求
for( int i=0 ; i<n ; i++ ){
for( int j=time ; j>=t[i] ; j-- ){
dp[j] = max( dp[j],dp[j-t[i]]+p[i] );
}
}
1.2 二维01背包(双重代价)
http://xyoj.xynu.edu.cn/problem.php?id=1418
//v[i]->代价1 V->可承受最高代价1
//m[i]->代价2 M->可承受最高代价2
//P[i]->需求
for( int i=0 ; i<n ; i++ ){
for( int j=V ; j>=v[i] ; j-- ){
for( int k=M ; k>=m[i] ; k-- ){
dp[j][k] = max( dp[j][k],dp[j-v[i]][k-m[i]]+p[i] );
}
}
}
2.完全背包
2.1 二维完全背包
http://xyoj.xynu.edu.cn/problem.php?id=1441
//w[i]->代价 v->可承受最高代价
for( int i=0 ; i<n ; i++ ){
for( int j=w[i] ; j<=v ; j++ ){
dp[j] = max( dp[j],dp[j-w[i]]+c[i] );
}
}
3.分组背包
http://xyoj.xynu.edu.cn/problem.php?id=1430
//g[i]->每个物品的组号 T->组号 M->可承受最高代价 w[i]->代价
//v[i]->价值
for( int k=1 ; k<=T ; k++ ){
for( int j=M ; j>=0 ; j-- ){
for( int i=0 ; i<n ; i++ ){
if( w[i]<=j && g[i]==k ){
dp[j] = max( dp[j],dp[j-w[i]]+v[i] );
}
}
}
}
4.多重背包
http://xyoj.xynu.edu.cn/problem.php?id=1428
//p[i]->物品的件数 v[i]->价值 m[i]->代价 M->可承受最高代价
for( int i=0 ; i<n ; i++ ) {
for( int k=1 ; k<=p[i] ; k++ ) {
for( int j=M ; j>=k*m[i] ; j-- ) {
dp[j] = max( dp[j],dp[j-m[i]]+v[i] );
}
}
}
5.混合背包(01,完全,多重)
http://xyoj.xynu.edu.cn/problem.php?id=1435
//p[i]->物品数量(0完全,1零一,其余多重)
//w[i]->代价 M->可承受最高代价
for( int i=0 ; i<n ; i++ ){
if( p[i]==1 ){ //01背包
for( int j=M ; j>=w[i] ; j-- ){
dp[j] = max( dp[j],dp[j-w[i]]+v[i] );
}
}else if( p[i]==0 ){ //完全背包
for( int j=w[i] ; j<=M ; j++ ){
dp[j] = max( dp[j],dp[j-w[i]]+v[i] );
}
}else { //多重背包
for( int k=1 ; k<=p[i] ; k++ ){
for( int j=M ; j>=w[i] ; j-- ){
dp[j] = max( dp[j],dp[j-w[i]]+v[i] );
}
}
}
}
持续添加中~~~