题意:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
思路:把多重背包转化为简单的01背包处理,减少复杂程度。
感想:简单多重背包,没啥好说的。。。
代码:
- <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];
- 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>