zoukankan      html  css  js  c++  java
  • 洛谷 P1441 砝码称重

    题目描述

    现有n个砝码,重量分别为a1,a2,a3,……,an,在去掉m个砝码后,问最多能称量出多少不同的重量(不包括0)。

    输入输出格式

    输入格式:

    输入文件weight.in的第1行为有两个整数n和m,用空格分隔

    第2行有n个正整数a1,a2,a3,……,an,表示每个砝码的重量。

    输出格式:

    输出文件weight.out仅包括1个整数,为最多能称量出的重量。

    输入输出样例

    输入样例#1: 复制
    3 1
    1 2 2
    输出样例#1: 复制
    3

    说明

    【样例说明】

    在去掉一个重量为2的砝码后,能称量出1,2,3共3种重量。

    【数据规模】

    对于20%的数据,m=0;

    对于50%的数据,m≤1;

    对于50%的数据,n≤10;

    对于100%的数据,n≤20,m≤4,m<n,ai≤100。

    看到数据不大,想到搜索,搜索去掉的砝码,计算可以称量的重量就是一个01背包。

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 using namespace std;
     5 int n,m,ans,s,a[25],b[25],f[2005];
     6 void dp()
     7 {
     8     memset(f,0,sizeof(f));
     9     f[0]=1;
    10     for(int i=1;i<=n;i++)
    11         if(!b[i])
    12             for(int j=s;j>=a[i];j--)
    13                 f[j]|=f[j-a[i]];
    14     int sum=0;
    15     for(int i=1;i<=s;i++)
    16         if(f[i])
    17             sum++;
    18     ans=max(ans,sum);
    19 }
    20 void dfs(int s,int num)
    21 {
    22     if(num>m)
    23     {
    24         dp();
    25         return;
    26     }
    27     for(int i=s;i<=n;i++)
    28     {
    29         b[i]=1;
    30         dfs(i+1,num+1);
    31         b[i]=0;
    32     }
    33 }
    34 int main()
    35 {
    36     scanf("%d%d",&n,&m);
    37     for(int i=1;i<=n;i++)
    38     {
    39         scanf("%d",a+i);
    40         s+=a[i];
    41     }
    42     dfs(1,1);
    43     printf("%d
    ",ans);
    44     return 0;
    45 }
  • 相关阅读:
    python_网络编程struct模块解决黏包问题
    python_网络编程socket(UDP)
    python_网络编程socket(TCP)
    python_面向对象
    python_生成器
    python_迭代器
    linux实操_shell自定义函数
    linux实操_shell系统函数
    linux实操_shell读取控制台输入
    scrapy-redis 0.6.8 配置信息
  • 原文地址:https://www.cnblogs.com/fantasquex/p/9342660.html
Copyright © 2011-2022 走看看