POJ 3628 Bookshelf2 / POJ 3624 Charm Bracelet / POJ 1384 初涉01背包与完全背包

来源:互联网 发布:环球科学 知乎 编辑:程序博客网 时间:2024/05/22 11:30

都是最基本的01背包,题意就不讲了。


01背包的状态转移方程,2维:dp[ i ][ j ] = max{dp[ i -1 ][ j ] , dp[ i-1][ j-w] + p}; 

    1维:dp[ i ] = max{dp[i] , dp[i-w] + p};

1维时要从大向小枚举,若从小向大枚举则变成了完全背包。

POJ 3624 

#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <queue>#include <cmath>#include <algorithm>#include <stack>#define LL long long#define ULL unsigned long long#define PI (acos(-1.0))#define EPS (1e-10)#pragma comment(linker,"/STACK:102400000,1024000")using namespace std;int f[12900];struct N{    int w,v;}p[4000];int main(){    int n,m,i,j;    scanf("%d %d",&n,&m);    memset(f,0,sizeof(int)*(m+4));    for(i = 0;i < n; ++i)    {        scanf("%d %d",&p[i].w,&p[i].v);    }    for(i = 0;i < n; ++i)    {        for(j = m; j >= 0;--j)        {            if(j >= p[i].w)                f[j] = max(f[j],f[j-p[i].w] + p[i].v);        }    }        printf("%d\n",f[m]);    return 0;}

POJ 3628

#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <queue>#include <cmath>#include <algorithm>#include <stack>#define LL long long#define ULL unsigned long long#define PI (acos(-1.0))#define EPS (1e-10)#pragma comment(linker,"/STACK:102400000,1024000")using namespace std;bool acc[21000001];int num[21];int main(){    memset(acc,false,sizeof(acc));    int n,m,i,j;    scanf("%d %d",&n,&m);    int Max = 0;    for(i = 0;i < n; ++i)    {        scanf("%d",&num[i]);        Max = max(num[i],Max);    }    int temp = m;    m += Max;    Max = m;    acc[0] = true;    for(i = 0;i < n; ++i)    {        for(j = m;j >= num[i]; --j)        {            if(acc[j-num[i]])            {                acc[j] = true;                if(j >= temp)                    Max = min(j,Max);            }        }    }    printf("%d\n",Max-temp);    return 0;}


0 0