01背包模板动态规划

来源:互联网 发布:帝国cms 搜索代码 编辑:程序博客网 时间:2024/05/17 20:31
以下附一维AC码:
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;struct node{    int w,v;}a[101];int f[101];int p[101][101];int w,n;void work(){    for(int i=1;i<=n;i++)        for(int j=w;j>=a[i].w;j--)        for(int k=0;k<=j/a[i].w;k++)            if(f[j-k*a[i].w]+k*a[i].v>f[j]){    f[j]=f[j-k*a[i].w]+k*a[i].v;    p[i][j]=k;}}void out(){    printf("%d\n",f[w]);    int j=w;    for(int i=n;i>=1;i--){    if(p[i][j])        printf("%d*%d ",i,p[i][j]);    j-=p[i][j]*a[i].w;}}int main(){scanf("%d%d",&w,&n);for(int i=1;i<=n;i++)    scanf("%d%d",&a[i].w,&a[i].v);    work();    out();}

以下附二维AC码:

#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;struct node{    int w,v;}a[101];int f[101][101];int p[101][101];int w,n;void work(){    for(int i=1;i<=n;i++)        for(int j=1;j<=w;j++)        for(int k=0;k<=j/a[i].w;k++)            if(f[i-1][j-k*a[i].w]+k*a[i].v>f[i][j]){    f[i][j]=f[i-1][j-k*a[i].w]+k*a[i].v;    p[i][j]=k;}}void out(){    printf("%d\n",f[n][w]);    int j=w;    for(int i=n;i>=1;i--){    if(p[i][j])        printf("%d*%d ",i,p[i][j]);    j-=p[i][j]*a[i].w;}}int main(){scanf("%d%d",&w,&n);for(int i=1;i<=n;i++)    scanf("%d%d",&a[i].w,&a[i].v);    work();    out();}


0 0
原创粉丝点击