满背包与dfs比较

来源:互联网 发布:zookeeper nginx 整合 编辑:程序博客网 时间:2024/05/18 10:28

题目描述: 
第七题 
小y 有一个宽度为 100cm,高度为 20cm,深度为 1cm 的柜子,如下图。 
这里写图片描述

小y 还有 3636 个礼物盒,他们的深度都为 1cm。 
他们对应的宽度和高度如下,单位(cm)。 
这里写图片描述 
现在小y 想把这些盒子放到柜子上,由于礼物盒里面都装有礼物,礼物盒必须向上放置,并且不能堆放。由于礼物盒深度和柜子深度一样,所以礼物盒和柜子深度方向也必须一致。并且礼物盒的高度还不能大于柜子的高度,否者放不进去。小y 希望放到柜子上礼物盒的宽度和正好等于柜子的宽度,也就是希望柜子两边都不存在间隙。如下图符合条件的放置。 
这里写图片描述 

满足条件的情况下,小y 希望能尽可能多的放置礼物盒,算出最多能放多少个礼物盒。

#include<cstdio>#include<iostream>using namespace std;#include<ctime>int a[100],b[100],ans=-1;void dfs(int cur,int s,int k){if(s>100||cur>36) return;if(s==100){ans=max(ans,k);return;}dfs(cur+1,s,k);dfs(cur+1,s+a[cur+1],k+1);}int main(){freopen("1.txt","r",stdin);for(int i=1;i<36;i++)cin>>a[i];int t1,t2;t1=clock();dfs(0,0,0);t2=clock();cout<<ans<<endl<<"时间:"<<t2-t1<<endl;return 0;}//运行结果:18  161603

#include<cstdio>#include<iostream>#include<ctime>using namespace std;int a[100],b[100],ans=-1;void dfs(int cur,int s,int k){if(s>100||cur>36) return;if(s==100){ans=max(ans,k);return;}for(int i=cur+1;i<=35;i++)dfs(i,s+a[cur+1],k+1);}int main(){freopen("1.txt","r",stdin);for(int i=1;i<36;i++)cin>>a[i];int t1,t2;t1=clock();dfs(0,0,0);t2=clock();cout<<ans<<endl<<"时间:"<<t2-t1<<endl;return 0;}//运行结果: 18 47772

//装满的01背包#include<cstdio>#include<iostream>#include<cstring>#include<ctime>using namespace std;int main(){freopen("1.txt","r",stdin);int dp[110],a[37],b[37],n;for(int i=1;i<=35;i++)cin>>a[i];int t1,t2;t1=clock();memset(dp,-0x3f3f3f3f,sizeof(dp));dp[0]=0;for(int i=1;i<=35;i++)for(int j=100;j>=a[i];j--)dp[j]=max(dp[j],dp[j-a[i]]+1);t2=clock();cout<<dp[100]<<endl<<"时间:"<<t2-t1<<endl;return 0;}//结果:18 0 

118111612610171065219475515315119179410121719201110203


1 0
原创粉丝点击