Problem Description
Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibix opened purse and found there were some coins. He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact price(without change) and he known the price would not more than m.But he didn't know the exact price of the watch.<br><br>You are to write a program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value A1,A2,A3...An then calculate how many prices(form 1 to m) Tony can pay use these coins.
Input
The input contains several test cases. The first line of each test case contains two integers n(1 ≤ n ≤ 100),m(m ≤ 100000).The second line contains 2n integers, denoting A1,A2,A3...An,C1,C2,C3...Cn (1 ≤ Ai ≤ 100000,1 ≤ Ci ≤ 1000). The last test case is followed by two zeros.
Output
For each test case output the answer on a single line.
Sample Input
3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
Sample Output
8 4
题意:有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>