关闭

2016SDAU课程练习三1020

118人阅读 评论(0) 收藏 举报
分类:

1.题目编号:1020
2.简单题意:多重背包问题

有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用
总和不超过背包容量,且价值总和最大。
3.解题思路形成:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}

4.感想:

5.AC代码:

#include<stdio.h>

#include<string.h>
int f[100001];
int main()
{
    int i,j,k,n,m,v,tot;
    int a[101];
    int b[101];
    while(scanf("%d%d",&n,&v),n||v)
    {
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(i=0;i<n;i++)
            scanf("%d",&b[i]);
        memset(f,0,sizeof(f));
        f[0]=1;
        tot=0;
        for(i=0;i<n;i++)
        {
            if(a[i]*b[i]>=v)
            {
                for(j=a[i];j<=v;j++)
                    if(f[j-a[i]]&&!f[j])
                    {f[j]=1;tot++;}
                continue;
            }
            k=1;
            while(k<b[i])
            {
                for(j=v;j-k*a[i]>=0;j--)
                    if(f[j-k*a[i]]&&!f[j])
                    {f[j]=1;tot++;}
                   b[i]-=k;
                k<<=1;
            }
            for(j=v;j-a[i]*b[i]>=0;j--)
                if(f[j-a[i]*b[i]]&&!f[j])
                {f[j]=1;tot++;}
        }
        printf("%d\n",tot);
    }
    return 0;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1797次
    • 积分:238
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条