一道01背包的裸题,不带拐弯的裸题...看代码吧


AC代码:

#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1005;   //数组不要开太小,不然会WA
int dp[MAXN];
int val[MAXN];           //存价值
int v[MAXN];             //存体积
int T,n,m;

int main()
{
  scanf("%d",&T);
  while(T--){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
      scanf("%d",&val[i]);
    }
    for(int i=0;i<n;i++){
      scanf("%d",&v[i]);
    }
    memset(dp,0,sizeof(dp));
    for(int i=0;i<n;i++){           //遍历每一个骨头
      for(int j=m;j>=v[i];j--){     //01背包过程
        dp[j] = max(dp[j],dp[j-v[i]]+val[i]);
      }
    }
    printf("%d\n",dp[m]);
  }
  return 0;
}
/*
  [来源] HDU 2602
  [题目] Bone Collector
  [大意]
     01背包裸题,输入n,m两个数代表骨头个数和你的背包的容量然后输入两行n个数,第一行表示骨头的价值,
     第二行表示骨头的大小,然后就是一个01背包的模板了。
  [输入]
     1
     5 10
     1 2 3 4 5
     5 4 3 2 1
  [输出]
     14
*/