您的位置:首页 > 其它

练习三 T

2016-05-31 21:18 281 查看
题意:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

思路:把多重背包转化为简单的01背包处理,减少复杂程度。

感想:简单多重背包,没啥好说的。。。

代码:

[cpp] view
plain copy

 print?

<span style="font-size:14px;color:#996633;">#include<iostream>  

#include<string>  

#include<cmath>  

#include<iomanip>  

#include<cstring>  

#include<algorithm>  

using namespace std;  

int dp[100100],w[100100],num[10010],val[10010];  

<
4000
span style="margin:0px;padding:0px;border:none;color:#000000;background-color:inherit;">int main()  

{  

    int i,j,k,n,m;  

    while(cin>>n>>m&&n+m)  

    {  

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

            cin>>w[i];  

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

            cin>>num[i];  

        k=0;  

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

        {  

            j=1;  

            while(j<=num[i])  

            {  

                num[i]-=j;  

                val[k++]=j*w[i];  

                j*=2;  

            }  

            if(num[i])  

                val[k++]=num[i]*w[i];  

        }  

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

        dp[0]=1;  

        for(i=0;i<k;i++)  

            for(j=m;j>=val[i];j--)  

                if(dp[j-val[i]])  

                   dp[j]=1;  

        int ans=0;  

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

            if(dp[i])  

                ans++;  

        printf("%d\n",ans);  

        

    }    

    return 0;  

}</span>  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: