01背包变形(背包容量大)

01背包变形(背包容量大)

转化成能够达到的最大价值

https://vjudge.net/problem/FZU-2214/origin

 

#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=1e3+6;
int n;
int w[maxn],v[maxn],dp[maxn];
//dp[i]表示i,价值为i的最小所需容量为dp[i]
int sum=0;

//01背包就地滚动
int main()
{
    int n,vi;
    scanf("%d%d",&n,&vi);
    for(int i=1;i<=n;i++)
        scanf("%d",&w[i]);

        for(int i=1;i<=n;i++)
   {
        scanf("%d",&v[i]);
        sum+=v[i];
   }
   for(int j=1;j<=sum;j++)
    dp[j]=100000000;
   dp[0]=0;
   for(int i=1;i<=n;i++)
   {
       for(int j=sum;j>=v[i];j--)
       {
           if(dp[j-v[i]]+w[i]<dp[j])
            dp[j]=dp[j-v[i]]+w[i];
       }
   }
   for(int j=sum;j>=0;j--)
   {
       if(dp[j]<vi)
        {printf("%d\n",j);
        break;
        }
   }
}

 

posted @ 2021-08-18 18:35  废柴废柴少女  阅读(88)  评论(0)    收藏  举报