题解 P1049 【装箱问题】
我采用的是纯暴力蒟蒻深搜,毕竟没必要动态规划
看看我的dfs三个参数就知道了
这题超级水,直接奉上代码,会在文中注释
#include <iostream>//输入输出流头文件
using namespace std;//懒得在cin、cout前面加std::
int a[20001]/*储存大小*/,v/*三级箱的容量*/,n/*几个东西*/;
int dfs(int nn/*搜索深度记录*/,int m/*从这开始,不能往前搜*/,int s/*被占用空间*/){
int min=2000000/够小吧,记录最小剩余空间/,t/*临时储存返回的最小空间*/;
if(nn==1) //搜到底了
{
for(int i=m;i<=n;i++) //依次把剩下可用物品累加,凑出最大的
if(v-s-a[i]>=0&&min>v-s-a[i]) min=v-s-a[i];
}
else//事情还没结束
for(int i=m;i<=n;i++) //继续遍历~
{
if(s+a[i]<=v) t=dfs(nn-1,i+1,s+a[i]);//层层深入
else continue; //不行,跳过这次
if(min>t) min=t;//比较
}
if(v-s<min) min=v-s;//以防无法进入下一层,min还是2000000
return min;//返回值
}
int main(){
cin>>v>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cout<<dfs(n,1,0)<<endl;
return 0;//我爱return,return爱我
}
管理员,看我这次鞠躬尽瘁地注释,就过了吧,不要有return个【错误:重复的算法】
我这解法就像这道水题一样水,浪费空间,时间