01背包

#include<iostream>
using namespace std;
int max(int a, int b)
{
    if(a > b)
        return a;
    else
        return b;
}
int main()
{
    int t, n, v,k, i;
    int c[1000], w[1000];
    int f[1000];
    scanf("%d",&t);
    while(t--)//表示测试的个数
    {
        memset(f,0,sizeof(f));
        scanf("%d%d",&n,&v);//n件物品,容量为V
        for(i = 0; i < n; i++)
            scanf("%d",&c[i]);//第i件物品体积大小为c[i]
        for(i = 0; i < n; i++)
            scanf("%d",&w[i]);//第i件物品价值w[i]
        for(i = 0; i < n; i++)
        {
            //f[k]容量为k的背包当前装入物品的最大价值,k < c[i] if k = 2 c[i] = 3 就是容量为2的背包不能装容量为3的物品,所以k要大于等于c[i]
            for(k = v;  k >= c[i]; k--)                 
            f[k] = max(f[k], f[k-c[i]]+w[i]);//先算这里面最大的一个赋给f[k]
        }
    }
    cout<<f[v]<<endl;
    return 0;
}
posted @ 2017-06-02 02:16  云胡同学  阅读(75)  评论(0编辑  收藏  举报