2016HUAS_ACM暑假集训4M - 基础DP

简单的0-1背包问题,大家都会做的。题意不想解释太多。

简述题目的案例及以几个关键

Sample Input

1                            //测试组数T

5 10                       //骨头总个数N,背包总体积V

1 2 3 4 5                //N块骨头各自的价值

5 4 3 2 1                //N块骨头各自的体积

 

Sample Output        //输出最大价值

14

注意:每种骨头只有一块,不然理解不了案例的Output是14。

骨头的价值和体积要分开输入。

最精髓的应该就是这句吧,可惜自己还不会融会贯通=_=||

dp[j]=max(dp[j],dp[j-volume[i]]+value[i]);

 

#include
#include
using namespace std;
#define maxn 1001

int N,T,V,i,j,ans;
int value[maxn],volume[maxn],dp[maxn];

int max(int a,int b)
{
    return a>b?a:b;
}

void DP(int n,int v)
{
    ans=0;
    memset(dp,0,sizeof(dp));
    for(i=1;i<=n;i++)
        for(j=v;j>=volume[i];j--)
        {
            dp[j]=max(dp[j],dp[j-volume[i]]+value[i]);
            ans=max(ans,dp[j]);
        }
    cout<endl;
}
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>N>>V;
        for(i=1;i<=N;i++)
            cin>>value[i];
        for(i=1;i<=N;i++)
            cin>>volume[i];
        DP(N,V);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/ankelen/p/5743666.html

你可能感兴趣的:(2016HUAS_ACM暑假集训4M - 基础DP)