poj1742--coins--多重背包可行性

Description

现在给你n种硬币,每个硬币的价值是a[i],以及此种硬币的数量为c[i],问你能用这些小硬币拼出来几种不同价值的大硬币,使得大硬币的价值在1~m之间。

Sample Input

3 10

1 2 4 2 1 1

2 5

1 4 2 1

0 0

Sample Output

8

4

题解:

  楼教主的男人八题之一qwq,听说是叫什么裸的多重背包可行性问题,题解都在注释里了。

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=100001;
 6 int w[maxn],num[maxn];
 7 int f[maxn],sum[maxn],ans;
 8 int main()
 9 {
10     int n,m;
11     while(scanf("%d%d",&n,&m)!=EOF)
12     {
13         if(n+m==0)break;
14         for(int i=1;i<=n;i++)
15             scanf("%d",&w[i]);
16         for(int i=1;i<=n;i++)
17             scanf("%d",&num[i]);
18         memset(f,0,sizeof(f));
19         f[0]=1;ans=0;
20         for(int i=1;i<=n;i++)
21         {
22             memset(sum,0,sizeof(sum));
23             for(int j=w[i];j<=m;j++)
24             {
25                 //f[j]!=1----当前有位置放物品
26                 //f[j-w[i]]!=0----没有空着位置不放
27                 //sum[j-w[i]]+1<=num[i]----当前物品放的数量没有超过限制
28                 if(!f[j]&&f[j-w[i]]&&sum[j-w[i]]+1<=num[i])
29                 {
30                     f[j]=1;
31                     sum[j]=sum[j-w[i]]+1;
32                     ans++;
33                 } 
34             }
35         }
36         printf("%d
",ans);
37     }
38     return 0;
39  } 
View Code
原文地址:https://www.cnblogs.com/Beckinsale/p/7460478.html