zoukankan      html  css  js  c++  java
  • 小猫爬山

    小猫爬山

    给出n件物品,第i件物品质量为(c_i),请用最少的组数划分这些物品,并保证每组的物品总质量不超过w,询问组数,(1≤N≤18)

    数据范围很小,考虑搜索,搜索的框架为,枚举每件物品到底放到哪一个组,显然我们需要保存下每一组已经放了多少质量的物品,记(g_i)表示第i组放的物品质量。

    至于剪枝,显而易见的为最优性剪枝,其次为更改搜索顺序,让质量大的物品先放入组中。

    参考代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #define il inline
    #define ri register
    using namespace std;
    int n,w,c[20],d[20],id[20],ans;
    void dfs(int,int);
    int main(){
    	scanf("%d%d",&n,&w);
    	for(int i(1);i<=n;++i)
    		scanf("%d",&c[i]);
    	ans=n,sort(c+1,c+n+1,greater<int>());
    	dfs(1,0),printf("%d",ans);
    	return 0;
    }
    void dfs(int a,int b){
    	if(b>=ans)return;
    	if(a>n)return (void)(ans=b);
    	int fail(0);
    	for(int i(1);i<=b;++i)
    		if(d[i]+c[a]<=w)
    			d[i]+=c[a],dfs(a+1,b),d[i]-=c[a];
    	d[b+1]=c[a],dfs(a+1,b+1);
    }
    
    
  • 相关阅读:
    CentOS随笔
    CentOS随笔
    CentOS随笔
    CentOS随笔
    产品从生到死的N宗罪
    即将结束的2015。
    Mvvm
    android 热补丁修复框架
    反编译APK
    关于短视频
  • 原文地址:https://www.cnblogs.com/a1b3c7d9/p/11276116.html
Copyright © 2011-2022 走看看