代码
//
0-1背包问题 如果不使用循环数组,空间越界。
#include < stdio.h >
int main()
{
int n, v, i, j;
int w[ 3403 ], p[ 3403 ];
int f[ 12881 ];
scanf( " %d %d " , & n, & v);
for (i = 1 ; i <= n; i ++ )
scanf( " %d %d " , & w[i], & p[i]);
for (i = 0 ; i <= v; i ++ )
f[i] = 0 ;
for (i = 1 ; i <= n; i ++ ) {
for (j = v; j >= w[i]; j -- ) {
if (f[j - w[i]] + p[i] > f[j])
f[j] = f[j - w[i]] + p[i];
}
}
printf( " %d\n " ,f[v]);
return 0 ;
}
#include < stdio.h >
int main()
{
int n, v, i, j;
int w[ 3403 ], p[ 3403 ];
int f[ 12881 ];
scanf( " %d %d " , & n, & v);
for (i = 1 ; i <= n; i ++ )
scanf( " %d %d " , & w[i], & p[i]);
for (i = 0 ; i <= v; i ++ )
f[i] = 0 ;
for (i = 1 ; i <= n; i ++ ) {
for (j = v; j >= w[i]; j -- ) {
if (f[j - w[i]] + p[i] > f[j])
f[j] = f[j - w[i]] + p[i];
}
}
printf( " %d\n " ,f[v]);
return 0 ;
}