01 背包基础题目

来源:互联网 发布:尔雅公选课软件 编辑:程序博客网 时间:2024/05/21 12:48



这道题目很简单,但是数据有一个很坑人之处,就是,有的骨头有价值,但是他所占的空间为0,如果你不知道你的代码为什么总是WA的话,可以试试下面这组数据

1

2 0

20 1

0 1

答案应该是20.当然,这是按照普通的二维DP来做的,没有进行优化,其实感觉DP就是背包啊

用了两种方法,优化的和没优化的,就是想多练练

//Bone Collector////题目链接:http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1001&ojid=0&cid=2521&hide=0//一维数组//#include<stdio.h>#include<string.h>#define max(x,y) (x)>(y)?(x):(y)int f[2000],c[2000],w[2000];int main(){int i,j,k;int t;int n,v;scanf("%d",&t);while(t--){memset(f,0,sizeof(f));scanf("%d%d",&n,&v);for(i=1;i<=n;i++)scanf("%d",&w[i]); for(i=1;i<=n;i++)scanf("%d",&c[i]);for(j=1;j<=n;j++){for(k=v;k>=c[j];k--)f[k]=max(f[k],f[k-c[j]]+w[j]);}printf("%d\n",f[v]);}return 0;}//二位普通DP思想//#include<stdio.h>#include<string.h>#define max(x,y) (x)>(y)?(x):(y)int w[2000],c[2000];int dp[2000][2000];int main(){int t;int n, v;int i, j, k;scanf("%d", &t);while(t--){scanf("%d%d", &n, &v);memset(dp,0,sizeof(dp));for(i = 1; i <= n; i++)scanf("%d", &w[i]);for(i = 1; i <= n; i++)scanf("%d", &c[i]);for(i = 1; i <= n; i++){for(j = 0; j <= v; j++)if(j>=c[i])dp[i][j]=max(dp[i-1][j],dp[i-1][j-c[i]]+w[i]);elsedp[i][j]=dp[i-1][j];}printf("%d\n", dp[n][v]);}return 0;}




原创粉丝点击