1017 Problem Q

1017 Problem Q

题意:一个容量为V的背包,放入体积和价值不同的骨头,求所能放入的骨头的最大价值。

思路:0-1背包问题,只要判断前一块骨头是否放入背包,状态方程为dp[i]=max(dp[i],dp[i-w[j]]+v[j])。其中w[j]表示当前骨头的体积,v[j]表示当前骨头的价值。

感想:背包问题,关键还是当前值,与前一状态值的判断比较。

#include<iostream>

#include<string.h>

using namespace std;

int w[1005],v[1005],dp[1005];

int main(){

   int i,j,n,m,t;

   cin>>t;

   while(t--){

       cin>>n>>m;

       memset(dp,0,sizeof(dp));

       for(i=1;i<=n;i++)

           cin>>v[i];

       for(i=1;i<=n;i++)

           cin>>w[i];

       for(i=1;i<=n;i++)

           for(j=m;j>=0;j--){

                if(j>=w[i])

                   dp[j]=max(dp[j],dp[j-w[i]]+v[i]);

           }

       cout<<dp[m]<<endl;

    }

   return 0;

}

你可能感兴趣的:(1017 Problem Q)