PTA_2022模拟赛_L3-2 拼题A打卡奖励 (30 分)_dp_w.v交换

// 数据量小的地方 就是突破口 
//
#include<bits/stdc++.h>
using namespace std;

const int N=1111;
int x[N],y[N],dp[33*N];
                // dp[i] 价值为 i 时的最小体积
int main()
{
    int n,v,i,j,sum;
    
    while( cin>>n>>v )
    {
        sum=0;
        for( i=1;i<=n;++i ) cin>>y[i];      // 总价值
        for( i=1;i<=n;++i ) { cin>>x[i]; sum+=x[i]; }

        memset( dp,0x3f,sizeof( dp ) );		// INF 
        dp[0]=0;
                                    // 同等价值的最小体积
        for( i=1;i<=n;++i )
            for( j=sum;j>=x[i];--j )
                dp[j]=min( dp[j],dp[j-x[i]]+y[i] );

        for( i=sum;~i;--i )         // 枚举价值 相应体积<=输入体积时 输出价值
            if( dp[i]<=v ) break;
        cout<<i<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/124244311