You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
# include <bits/stdc++.h>
using namespace std ;
const int N = 1010 ;
const int M = 110 ;
int f [ N ] [ M ] [ M ] ;
int n , m1 , m2 ;
// 二维费用01背包-不少于维度费用,求最小代价
int main ( ) {
// 注意次序
cin > > m1 > > m2 > > n ;
// 求最小值
memset ( f , 0x3f , sizeof f ) ;
f [ 0 ] [ 0 ] [ 0 ] = 0 ;
for ( int i = 1 ; i < = n ; i + + ) {
int v1 , v2 , w ;
cin > > v1 > > v2 > > w ;
for ( int j = 0 ; j < = m1 ; j + + )
for ( int k = 0 ; k < = m2 ; k + + ) {
// 不选择i号物品
f [ i ] [ j ] [ k ] = f [ i - 1 ] [ j ] [ k ] ;
// 分情况讨论
// 物品i加上就够一维使用, 此时, 只关心二维情况即可
if ( j - v1 < 0 & & k - v2 > = 0 )
f [ i ] [ j ] [ k ] = min ( f [ i ] [ j ] [ k ] , f [ i - 1 ] [ 0 ] [ k - v2 ] + w ) ;
// 物品i加上就够二维使用, 此时, 只关心一维情况即可
else if ( j - v1 > = 0 & & k - v2 < 0 )
f [ i ] [ j ] [ k ] = min ( f [ i ] [ j ] [ k ] , f [ i - 1 ] [ j - v1 ] [ 0 ] + w ) ;
// 如果选择了i号物品, 两个维度直接拉满, 那么只选择一个i就足够用, 它参选的价值是w
else if ( j - v1 < 0 & & k - v2 < 0 )
f [ i ] [ j ] [ k ] = min ( f [ i ] [ j ] [ k ] , w ) ;
else
// 正常递推
f [ i ] [ j ] [ k ] = min ( f [ i ] [ j ] [ k ] , f [ i - 1 ] [ j - v1 ] [ k - v2 ] + w ) ;
}
}
printf ( " %d \n " , f [ n ] [ m1 ] [ m2 ] ) ;
return 0 ;
}