01背包问题与完全背包问题 代码非常相似
一个是从后往前遍历,一个是从前往后遍历。
01背包问题代码
#include <stdio.h>
#include <stdlib.h>
int dp[10001];
int v[10001];
int w[10001];
int max(int a, int b);
int main()
{
int n,value;
while ( ~scanf("%d %d",&n,&value) ) {
int j,k,i;
for ( i=1; i<=n; i++ ) {
scanf("%d %d",&w[i],&v[i]);
}
for ( i=0; i<=value; i++ ) { // 数组太大容易报错,所以放在外面再归零。
dp[i] = 0;
}
for ( j=1; j<=n; j++ ) {
for ( k=value; k>=1; k-- ) { // 从后往前遍历
if ( k>=w[j] ) {
dp[k] = max( dp[k], dp[k-w[j]] + v[j] );
}
}
}
printf("%d\n",dp[value]);
}
return 0;
}
int max(int a, int b)
{
if ( a>b ) {
return a;
}
return b;
}
完全背包问题
#include <stdio.h>
#include <stdlib.h>
int dp[10001];
int v[10001];
int w[10001];
int max(int a, int b);
int main()
{
int n,value;
while ( ~scanf("%d %d",&n,&value) ) {
int j,k,i;
for ( i=1; i<=n; i++ ) {
scanf("%d",&v[i]);
}
for ( i=1; i<=n; i++ ) {
scanf("%d",&w[i]);
}
for ( i=0; i<=value; i++ ) {
dp[i] = 0;
}
for ( j=1; j<=n; j++ ) {
for ( k=1; k<=value; k++ ) { // 从前往后遍历
if ( k>=w[j] ) {
dp[k] = max( dp[k], dp[k-w[j]] + v[j] );
}
}
}
printf("%d\n",dp[value]);
}
return 0;
}
int max(int a, int b)
{
if ( a>b ) {
return a;
}
return b;
}