hdu2602(01背包模板题)

来源:互联网 发布:mysql没有密码如何连接 编辑:程序博客网 时间:2024/06/14 16:03


01背包模板题

有N件物品和一个容量为V的背包, 每种物品均只有一件。第i件物品的费用是vo[i],价值是va[i]。求解将哪些物品装入背包可使价值总和最大。

状态方程是

dp[i][j]=Max(dp[i-1][j],dp[i-1][j-vo[i]]+va[i]);

空间优化后

dp[j]=Max(dp[j],dp[j-vo[i]]+va[i])

#include<iostream>#include <cstring>using namespace std;#define Size 1111int va[Size],vo[Size];int dp[Size];int Max(int x,int y){    return x>y?x:y;}int main(){    int t,n,v;    int i,j;    cin>>t;    while(t--)    {        cin>>n>>v;        for(i=1;i<=n;i++)            cin>>va[i];        for(i=1;i<=n;i++)            cin>>vo[i];        memset(dp,0,sizeof(dp));        for(i=1;i<=n;i++)        {            for(j=v;j>=vo[i];j--)            {                dp[j]=Max(dp[j],dp[j-vo[i]]+va[i]);            }        }        cout<<dp[v]<<endl;    }    return 0;}


0 0