zoukankan      html  css  js  c++  java
  • 12G:忍者道具

    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述

    忍者道具有很多种,苦无,飞镖,震爆弹。L君热衷于收集忍者道具,现在他有N个道具,每个道具的重量分别是C1、C2…CN。现在他想把这N个道具装到载重量为W的工具包里,请问他最少需要多少个工具包?

    输入
    第一行包含两个用空格隔开的整数,N和W。
    接下来N行每行一个整数,其中第i+1行的整数表示第i个道具的重量Ci。
    输出
    输出一个整数,最少需要多少个工具包。
    样例输入
    5 1996
    1
    2
    1994
    12
    29
    
    样例输出
    2
    提示
    对于100%的数据,1<=N<=18,1<=Ci<=W<=10^8。
     1 #include<iostream>
     2 using namespace std;
     3 int a[20];
     4 int bag[20];
     5 int ans = 1<<30;
     6 int n, w;
     7 void dfs(int x, int sum){ //正在放第x个物品,已经用了sum个背包 
     8     if(sum>=ans) return;
     9     if(x==n+1){
    10         ans = min(ans,sum);
    11         return;
    12     }
    13     for(int i = 1; i <= sum; i++){ //放在已有背包里 
    14         if(bag[i]>=a[x]){
    15             bag[i] -= a[x];
    16             dfs(x+1, sum);
    17             bag[i] += a[x];
    18         }
    19     }
    20     bag[sum+1]-=a[x]; //或者新开一个背包 
    21     dfs(x+1, sum+1);
    22     bag[sum+1]+=a[x];
    23 }
    24 int main(){
    25     cin>>n>>w;
    26     for(int i = 1; i <= n; i++)
    27         cin>>a[i];
    28     for(int i = 1; i <= n; i++)
    29         bag[i] = w;
    30     dfs(1, 1);
    31     cout<<ans<<endl;
    32     return 0;
    33 }

    备注:我觉得我得好好看看dfs,不能再一看见这种搜索题就懵orz  这题数据规模这么小,完全一看就是搜索。

    搜的话就看看搜什么。每个物品都要装包里的,那就搜物品好了。每个物品无非就两种可能,要么就装在已有的包里,要么新开一个包,我没想到可以用一个数组来模拟背包,也没想到可以在dfs加一个参数表示现在已经用了多少背包。

    自闭了。

  • 相关阅读:
    LeetCode-389-找不同
    xml配置与使用
    curl使用
    php中JPGraph入门配置与应用
    php开发通用采集程序
    adodb配置与使用
    swfupload上传
    ZendFramework使用中常见问题
    memcache配置与使用
    第四章 供给与需求的市场力量
  • 原文地址:https://www.cnblogs.com/fangziyuan/p/13160662.html
Copyright © 2011-2022 走看看