题目:
你有N张CD你要将这N张CD刻录到规定长度的CD里,每个CD都有自己的长度,要求浪费空间最小并且张数最多。
思路:
简单的01背包问题,要求记录CD的序号,用队列或者动态数组即可解决。
代码:
#include <bits/stdc++.h>
using namespace std;
vector < int > dp[ 1000001 ];
int main() {
int N, n;
int i, j, k;
while ( scanf( "%d %d", &N, &n ) != EOF ) {
for ( i = 0; i <= N; i++ ) {
dp[ i ].clear();
dp[ i ].push_back( 0 );
}
while ( n -- ) {
cin >> k;
for ( i = N; i >= k; i-- ) {
if ( dp[ i ][ 0 ] <= dp[ i - k ][ 0 ] + k ) {
if ( dp[ i ][ 0 ] == dp[ i - k ][ 0 ] + k ) {
if ( dp[ i ].size() < dp[ i - k ].size() ) {
dp[ i ].assign( dp[ i - k ].begin(), dp[ i - k ].end( ) );
dp[ i ][ 0 ] += k;
dp[ i ].push_back( k );
}
} else {
dp[ i ].assign( dp[ i - k ].begin(), dp[ i - k ].end( ) );
dp[ i ][ 0 ] += k;
dp[ i ].push_back( k );
}
}
}
}
for ( i = 1 ; i < dp[ N ].size( ) ; i++ ) {
cout << dp[ N ][ i ] << ' ';
}
cout << "sum:" << dp[ N ][ 0 ] << endl;
}
}