zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    委托
    apply()和call()
    Sql小技巧
    plsql中文乱码
    Windows8中使用IE8等低版本浏览器
    React Native
    谷歌浏览器添加flash白名单
    jsonp原理详解
    垂直居中
    window.moveTo(),window.moveBy()不生效
  • 原文地址:https://www.cnblogs.com/Beckinsale/p/7460478.html
Copyright © 2011-2022 走看看