代码改变世界

NYOJ--311(完全背包)

2013-12-03 17:30  gongti  阅读(154)  评论(0编辑  收藏  举报
题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=311

分析:这里就是一个完全背包,需要注意的就是初始化和最后的输出情况
       dp[j]=max{ dp[j],dp[j-c[i]]+w[i] }

#include<stdio.h>

const int INF=0XFFFFFF;
int main()
{
  int N,M,V,c[2010],w[2010],dp[50000];
  scanf("%d",&N);
  while (N--)
  {
    //读取数据
    scanf("%d%d",&M,&V);
    for(int i=1;i<=M;i++)
      scanf("%d%d",&c[i],&w[i]);
    //数据初始化
    for(int i=0;i<=V;i++)
      dp[i]=-INF;
    dp[0]=0;
    //利用递推关系
    for(int i=1;i<=M;i++)
      for(int j=c[i];j<=V;j++)
       dp[j]=dp[j]>dp[j-c[i]]+w[i]?dp[j]:dp[j-c[i]]+w[i];
    //输出。这里是要求背包装满
    if(dp[V]<0)
      printf("NO\n");
    else
      printf("%d\n",dp[V]);
  }
  return 0;
}

《背包九讲》里面有关于初始化的问题。