hud_bone Collector

来源:互联网 发布:达芬奇调色 知乎 编辑:程序博客网 时间:2024/06/01 07:12

这是一道全裸的01背包,好像除了可能测试数据中存在有价值但是耗费为0的数据,其他的就是套用01背包的模板就能过了。有两个代码,一个是用二维数组,另一个是一维数组,二维的比较好理解,一维的空间复杂度较小,各有所长。

#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>using namespace std;int max(int a,int b){    return a>b? a:b;}int t,cost[1100],value[1100],dp[1100];int main(){    scanf("%d",&t);    while(t--)    {        int n,v;        scanf("%d%d",&n,&v);        for(int i=1;i<=n;i++)            scanf("%d",&value[i]);        for(int i=1;i<=n;i++)            scanf("%d",&cost[i]);        memset(dp,0,sizeof(dp));        for(int i=1;i<=n;i++)        {            for(int j=v;j>=0;j--)            {                if(j>=cost[i])                    dp[j]=max(dp[j],dp[j-cost[i]]+value[i]);                else                    dp[j]=dp[j];              //  cout<<dp[j]<<" ";            }          //  cout<<endl;        }        cout<<dp[v]<<endl;    }    return 0;}



#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>using namespace std;int max(int a,int b){    return a>b? a:b;}int t,cost[1100],value[1100],dp[1100][1100];int main(){    scanf("%d",&t);    while(t--)    {        int n,v;        scanf("%d%d",&n,&v);        for(int i=1;i<=n;i++)            scanf("%d",&value[i]);        for(int i=1;i<=n;i++)            scanf("%d",&cost[i]);        memset(dp,0,sizeof(dp));        for(int i=1;i<=n;i++)        {            for(int j=0;j<=v;j++)            {                if(j>=cost[i])                    dp[i][j]=max(dp[i-1][j],dp[i-1][j-cost[i]]+value[i]);                else                    dp[i][j]=dp[i-1][j];            }        }        cout<<dp[n][v]<<endl;    }    return 0;}



0 0
原创粉丝点击