背包九讲2.6
主要思路:
顺便做俩题,贴出来,备忘!!
代码:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAXN 105
//#define LOCAL
int dp[MAXN] = {0} , lesson[MAXN][MAXN] = {0} ;
void Group_OneZeroPack( int M , int N ){
for( int i = 1 ; i <= M ; i++ )
for( int j = N ; j >= 0 ; j-- )
for( int k = 1 ; k <= j ; k++ )
dp[j] = max( dp[j] , dp[j-k] + lesson[i][k] ) ;
}
int main() {
#ifdef LOCAL
freopen("Input.txt","r",stdin);
freopen("Output.txt","w",stdout);
#endif
int M , N , i , j , temp ;
while( scanf( "%d%d" , &M , &N ) , M+N ){
memset( dp , 0 , sizeof(dp) ) ;
for( i = 1 ; i <= M ; i++ )
for( j = 1 ; j <= N ; j++ )
scanf( "%d" , &lesson[i][j] ) ;
Group_OneZeroPack( M , N ) ;
printf( "%d\n" , dp[N] ) ;
}
return 0;
}
代码:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include<iostream>
#include <algorithm>
using namespace std;
#define maxn 10005
//#define LOCAL
#define CLR( a , b ) memset( a , b ,sizeof(a) )
int dp[11][maxn] , c[100] , v[100] , N , M , K , Bag[11][101] , Sum[11] ;
int main() {
#ifdef LOCAL
freopen("Input.txt","r",stdin);
freopen("Output.txt","w",stdout);
#endif
int i , j , k , x ;
while( ~scanf( "%d%d%d" , &N , &M , &K) ){
CLR( Sum , 0 ) ;
for( i = 0 ; i < N ; i++ ){
scanf( "%d%d%d" , &x , &c[i] , &v[i] ) ;
Bag[x][ Sum[x] ] = i ; //记录到该品牌
Sum[x] ++ ; //控制个数
}
memset( dp , -1 , sizeof(dp) ) ;
for( i = 0 ; i <= M ; i++ ){ //初始化
dp[0][i] = 0 ;
}
for( i = 1 ; i <= K ; i++ ) //品牌编号
for( j = 0 ; j < Sum[i] ; j++ ) //该编号个数
for( k = M ; k >= c[Bag[i][j]] ; k-- ){
if( dp[i][ k-c[ Bag[i][j] ] ] != -1 )
dp[i][k] = max( dp[i][k] , dp[i][ k-c[Bag[i][j]] ] + v[Bag[i][j] ] ) ;
if( dp[i-1][ k-c[ Bag[i][j]] ] != -1 )
dp[i][k] = max( dp[i][k] , dp[ i-1 ][ k-c[Bag[i][j]] ] + v[Bag[i][j] ] ) ;
}
if( dp[K][M] < 0 )
printf( "Impossible\n" ) ;
else
printf( "%d\n" , dp[K][M] ) ;
}
return 0;
}