5.3.1 Milk Measuring 量取牛奶
/*
PROG: milk4
LANG: C++
*/
#include < cstdio >
#include < cstring >
#include < cstdlib >
using namespace std;
int V,N;
int len;
int ans;
int a[ 101 ];
int use[ 101 ];
bool vis[ 20001 ];
int cmp( const void * x, const void * y){
return * ( int * )x -* ( int * )y;
}
void init()
{
scanf( " %d%d " , & V, & N);
for ( int i = 1 ;i <= N; ++ i)
scanf( " %d " ,a + i);
qsort(a + 1 ,N, sizeof ( int ),cmp);
}
void out ()
{
printf( " %d " ,len);
for ( int i = 1 ;i <= len; ++ i)
printf( " %d " ,use[i]);
printf( " \n " );
exit( 0 );
}
void DP()
{
memset(vis, 0 , sizeof (vis));
/* vis[0]=1; */
for ( int i = 1 ;i <= V / use[ 1 ]; ++ i)
vis[i * use[ 1 ]] = 1 ;
for ( int i = 2 ;i <= len; ++ i)
for ( int j = use[i];j <= V; ++ j)
vis[j] = vis[j] | vis[j - use[i]];
if (vis[V])
out ();
} // 完全背包
void dfs( int pre)
{
if (len == ans)
DP();
else {
len ++ ;
for ( int i = pre;i <= N; ++ i){
use[len] = a[i];
dfs(i + 1 );
}
-- len;
}
}
void DFSID()
{
len = 0 ;
for (ans = 1 ;ans <= N; ++ ans)
dfs( 1 );
}
int main()
{
freopen( " milk4.in " , " r " ,stdin);
freopen( " milk4.out " , " w " ,stdout);
init();
DFSID();
return 0 ;
}
/*
Executing
Test 1: TEST OK [0.000 secs, 2824 KB]
Test 2: TEST OK [0.011 secs, 2824 KB]
Test 3: TEST OK [0.000 secs, 2824 KB]
Test 4: TEST OK [0.000 secs, 2824 KB]
Test 5: TEST OK [0.011 secs, 2824 KB]
Test 6: TEST OK [0.011 secs, 2824 KB]
Test 7: TEST OK [0.140 secs, 2824 KB]
Test 8: TEST OK [0.054 secs, 2824 KB]
Test 9: TEST OK [0.043 secs, 2824 KB]
Test 10: TEST OK [0.292 secs, 2824 KB]
*/
/*
DP优化后
Executing
Test 1: TEST OK [0.011 secs, 2824 KB]
Test 2: TEST OK [0.000 secs, 2824 KB]
Test 3: TEST OK [0.000 secs, 2824 KB]
Test 4: TEST OK [0.011 secs, 2824 KB]
Test 5: TEST OK [0.000 secs, 2824 KB]
Test 6: TEST OK [0.000 secs, 2824 KB]
Test 7: TEST OK [0.130 secs, 2824 KB]
Test 8: TEST OK [0.032 secs, 2824 KB]
Test 9: TEST OK [0.032 secs, 2824 KB]
Test 10: TEST OK [0.184 secs, 2824 KB]
*/
PROG: milk4
LANG: C++
*/
#include < cstdio >
#include < cstring >
#include < cstdlib >
using namespace std;
int V,N;
int len;
int ans;
int a[ 101 ];
int use[ 101 ];
bool vis[ 20001 ];
int cmp( const void * x, const void * y){
return * ( int * )x -* ( int * )y;
}
void init()
{
scanf( " %d%d " , & V, & N);
for ( int i = 1 ;i <= N; ++ i)
scanf( " %d " ,a + i);
qsort(a + 1 ,N, sizeof ( int ),cmp);
}
void out ()
{
printf( " %d " ,len);
for ( int i = 1 ;i <= len; ++ i)
printf( " %d " ,use[i]);
printf( " \n " );
exit( 0 );
}
void DP()
{
memset(vis, 0 , sizeof (vis));
/* vis[0]=1; */
for ( int i = 1 ;i <= V / use[ 1 ]; ++ i)
vis[i * use[ 1 ]] = 1 ;
for ( int i = 2 ;i <= len; ++ i)
for ( int j = use[i];j <= V; ++ j)
vis[j] = vis[j] | vis[j - use[i]];
if (vis[V])
out ();
} // 完全背包
void dfs( int pre)
{
if (len == ans)
DP();
else {
len ++ ;
for ( int i = pre;i <= N; ++ i){
use[len] = a[i];
dfs(i + 1 );
}
-- len;
}
}
void DFSID()
{
len = 0 ;
for (ans = 1 ;ans <= N; ++ ans)
dfs( 1 );
}
int main()
{
freopen( " milk4.in " , " r " ,stdin);
freopen( " milk4.out " , " w " ,stdout);
init();
DFSID();
return 0 ;
}
/*
Executing
Test 1: TEST OK [0.000 secs, 2824 KB]
Test 2: TEST OK [0.011 secs, 2824 KB]
Test 3: TEST OK [0.000 secs, 2824 KB]
Test 4: TEST OK [0.000 secs, 2824 KB]
Test 5: TEST OK [0.011 secs, 2824 KB]
Test 6: TEST OK [0.011 secs, 2824 KB]
Test 7: TEST OK [0.140 secs, 2824 KB]
Test 8: TEST OK [0.054 secs, 2824 KB]
Test 9: TEST OK [0.043 secs, 2824 KB]
Test 10: TEST OK [0.292 secs, 2824 KB]
*/
/*
DP优化后
Executing
Test 1: TEST OK [0.011 secs, 2824 KB]
Test 2: TEST OK [0.000 secs, 2824 KB]
Test 3: TEST OK [0.000 secs, 2824 KB]
Test 4: TEST OK [0.011 secs, 2824 KB]
Test 5: TEST OK [0.000 secs, 2824 KB]
Test 6: TEST OK [0.000 secs, 2824 KB]
Test 7: TEST OK [0.130 secs, 2824 KB]
Test 8: TEST OK [0.032 secs, 2824 KB]
Test 9: TEST OK [0.032 secs, 2824 KB]
Test 10: TEST OK [0.184 secs, 2824 KB]
*/
DP:
/*
PROG: milk4
LANG: C++
*/
#include < cstdio >
#include < cstdlib >
#include < cstring >
using namespace std;
int Q,N;
int a[ 101 ];
int f[ 20001 ];
int pre_f[ 20001 ] = { 0 };
int pre_v[ 20001 ] = { 0 };
bool ans[ 101 ] = { 0 };
int cmp( const void * x, const void * y)
{
return * ( int * )y -* ( int * )x;
}
void init()
{
scanf( " %d%d " , & Q, & N);
for ( int i = 1 ;i <= N; ++ i)
scanf( " %d " ,a + i);
qsort(a + 1 ,N, sizeof ( int ),cmp);
}
bool check( int i, int j)
{
while (i && j)
{
if (pre_f[i] > pre_f[j])
return 1 ;
if (pre_f[i] < pre_f[j])
return 0 ;
i = pre_v[i];
j = pre_v[j];
}
return 0 ;
}
void solve()
{
memset(f, 0x7F , sizeof (f));
f[ 0 ] = 0 ;
for ( int i = 1 ;i <= N; ++ i)
for ( int j = 0 ;j <= Q; ++ j)
for ( int d = 1 ;; ++ d){
int now = j + a[i] * d;
if (now > Q) break ;
if (f[now] > f[j] + 1 ||
((f[now] == f[j] + 1 ) && ((i > pre_f[now]) || (i == pre_f[now] && check(j,pre_v[now]))))){
f[now] = f[j] + 1 ;
pre_f[now] = i;
pre_v[now] = j;
}
}
}
void out ()
{
for ( int i = Q;i;i = pre_v[i])
ans[pre_f[i]] = 1 ;
printf( " %d " ,f[Q]);
for ( int i = N;i >= 1 ; -- i)
if (ans[i])
printf( " %d " ,a[i]);
printf( " \n " );
}
int main()
{
freopen( " milk4.in " , " r " ,stdin);
freopen( " milk4.out " , " w " ,stdout);
init();
solve();
out ();
return 0 ;
}
/*
Executing
Test 1: TEST OK [0.022 secs, 3032 KB]
Test 2: TEST OK [0.000 secs, 3032 KB]
Test 3: TEST OK [0.000 secs, 3032 KB]
Test 4: TEST OK [0.011 secs, 3032 KB]
Test 5: TEST OK [0.032 secs, 3032 KB]
Test 6: TEST OK [0.022 secs, 3032 KB]
Test 7: TEST OK [0.011 secs, 3032 KB]
Test 8: TEST OK [0.054 secs, 3032 KB]
Test 9: TEST OK [0.022 secs, 3032 KB]
Test 10: TEST OK [0.054 secs, 3032 KB]
*/
PROG: milk4
LANG: C++
*/
#include < cstdio >
#include < cstdlib >
#include < cstring >
using namespace std;
int Q,N;
int a[ 101 ];
int f[ 20001 ];
int pre_f[ 20001 ] = { 0 };
int pre_v[ 20001 ] = { 0 };
bool ans[ 101 ] = { 0 };
int cmp( const void * x, const void * y)
{
return * ( int * )y -* ( int * )x;
}
void init()
{
scanf( " %d%d " , & Q, & N);
for ( int i = 1 ;i <= N; ++ i)
scanf( " %d " ,a + i);
qsort(a + 1 ,N, sizeof ( int ),cmp);
}
bool check( int i, int j)
{
while (i && j)
{
if (pre_f[i] > pre_f[j])
return 1 ;
if (pre_f[i] < pre_f[j])
return 0 ;
i = pre_v[i];
j = pre_v[j];
}
return 0 ;
}
void solve()
{
memset(f, 0x7F , sizeof (f));
f[ 0 ] = 0 ;
for ( int i = 1 ;i <= N; ++ i)
for ( int j = 0 ;j <= Q; ++ j)
for ( int d = 1 ;; ++ d){
int now = j + a[i] * d;
if (now > Q) break ;
if (f[now] > f[j] + 1 ||
((f[now] == f[j] + 1 ) && ((i > pre_f[now]) || (i == pre_f[now] && check(j,pre_v[now]))))){
f[now] = f[j] + 1 ;
pre_f[now] = i;
pre_v[now] = j;
}
}
}
void out ()
{
for ( int i = Q;i;i = pre_v[i])
ans[pre_f[i]] = 1 ;
printf( " %d " ,f[Q]);
for ( int i = N;i >= 1 ; -- i)
if (ans[i])
printf( " %d " ,a[i]);
printf( " \n " );
}
int main()
{
freopen( " milk4.in " , " r " ,stdin);
freopen( " milk4.out " , " w " ,stdout);
init();
solve();
out ();
return 0 ;
}
/*
Executing
Test 1: TEST OK [0.022 secs, 3032 KB]
Test 2: TEST OK [0.000 secs, 3032 KB]
Test 3: TEST OK [0.000 secs, 3032 KB]
Test 4: TEST OK [0.011 secs, 3032 KB]
Test 5: TEST OK [0.032 secs, 3032 KB]
Test 6: TEST OK [0.022 secs, 3032 KB]
Test 7: TEST OK [0.011 secs, 3032 KB]
Test 8: TEST OK [0.054 secs, 3032 KB]
Test 9: TEST OK [0.022 secs, 3032 KB]
Test 10: TEST OK [0.054 secs, 3032 KB]
*/