现在的位置: 首页 > 综合 > 正文

NYOJ 860 又见01背包

2019年02月25日 ⁄ 综合 ⁄ 共 501字 ⁄ 字号 评论关闭

题目链接~~>

做题感悟:这题是在做周赛时接触的,一看题目感觉很简单,又一看数据没法开数组,那就只有用搜索了,果断超时。

解题思路:因为价值最多才 1e4 所以可以把价值看成背包的容量,选的时候选重量轻的,之后再从最大价值开始遍历,只要重量满足就 break ;

代码:

#include<stdio.h>
const int INF =1e9+5 ;
int w[105],v[105],dp[10005] ;
int main()
{
    int i,j,n,m ;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int sum=0 ;
        for(i=0 ;i<n ;i++)
        {
            scanf("%d%d",&w[i],&v[i]) ;
            sum+=v[i] ; // 价值上限
        }
        dp[0]=0 ;
        for(i=1 ;i<=sum ;i++)
               dp[i]=INF ;
        for(i=0 ;i<n ;i++)
          for(j=sum ;j>=v[i] ;j--)
              if(dp[j]>dp[j-v[i]]+w[i])
                      dp[j]=dp[j-v[i]]+w[i] ;
        for(j=sum ;j>=0 ;j--)
          if(dp[j]<=m)
           {
               printf("%d\n",j) ;
               break ;
           }
    }
    return 0 ;
}

 

抱歉!评论已关闭.