ACM-背包问题Bone Collector&&饭卡

来源:互联网 发布:sql数据库备份软件 编辑:程序博客网 时间:2024/05/29 13:21
Bone Collector
#include<stdio.h>#include<string.h>int f[2223],v[1111],w[1111];int max(int a,int b){    if(a>b) return a;    else return b;}int main(){    int nn;    int n,i,j,m;    scanf("%d",&nn);    while(nn--){   scanf("%d%d",&n,&m);        for(i=0;i<n;i++)        scanf("%d",&w[i]);        for(i=0;i<n;i++)        scanf("%d",&v[i]);        memset(f,0,sizeof(f));;        for(i=0;i<n;i++)            for(j=m;j>=v[i];j--)        {            f[j]=max(f[j],f[j-v[i]]+w[i]);        }       /* for(i=0;i<=m;i++) printf("%d ",f[i]);*/        printf("%d\n",f[m]);    }}
饭卡
<pre name="code" class="cpp">#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct e{    int w;    int v;}a[1111];int cmp(e a,e b){    return a.w<b.w;}int max(int a,int b){    if(a>b) return a;    else return b;}int main(){        int n,i,j,m;        while(scanf("%d",&n)!=EOF){        if(n==0) break;        int f[2222];        memset(f,0,sizeof(f));        for(i=0;i<n;i++)            {scanf("%d",&a[i].v);a[i].w=a[i].v;}        sort(a,a+n,cmp);        scanf("%d",&m);        for(i=0;i<n-1;i++)            for(j=m-5;j>=a[i].v;j--)        {            f[j]=max(f[j],f[j-a[i].v]+a[i].w);        }       /* for(i=0;i<=m;i++) printf("%d ",f[i]);*/        if(m<5 ) printf("%d\n",m);        else printf("%d\n",m-f[m-5]-a[n-1].w);    }}


比较简单的两个纯背包问题。弱表示只会一维数组- -

for(i=0;i<n-1;i++)            for(j=m-5;j>=a[i].v;j--)        {            f[j]=max(f[j],f[j-a[i].v]+a[i].w);        }
主要代码就是这个,还不是特别理解,慢慢来- -、

0 0
原创粉丝点击