类背包问题
答案:2 悬赏:30 手机版
解决时间 2021-03-26 20:32
- 提问者网友:最爱你的唇
- 2021-03-26 11:28
类背包问题
最佳答案
- 五星知识达人网友:琴狂剑也妄
- 2021-03-26 12:21
写了个更烂的dfs程序。
#include
#include
int data[40]={0};
int n;
int min=0;
void calculate(int num,int h,int ans)
{
if(num>n+1 | h>19920726) return;//可行性剪枝
if(h==19920726)
{
if(ans>min)
{
min=ans;
}
return;
}
else
{
calculate(num+1,h+data[num],ans+1);
calculate(num+1,h,ans);
}
}
int main(void)
{
int k;
int tmp;
freopen("gift.in","r",stdin);
freopen("gift.out","w",stdout);
scanf("%d",&n);
for(k=1;k<=n;k++)
{
scanf("%d",&tmp);
if(tmp>19920726)
{
n--;
k--;
}
else
{
data[k]=tmp;
}
}
calculate(1,0,0);
printf("%d\n",min);
return 0;
}
#include
#include
int data[40]={0};
int n;
int min=0;
void calculate(int num,int h,int ans)
{
if(num>n+1 | h>19920726) return;//可行性剪枝
if(h==19920726)
{
if(ans>min)
{
min=ans;
}
return;
}
else
{
calculate(num+1,h+data[num],ans+1);
calculate(num+1,h,ans);
}
}
int main(void)
{
int k;
int tmp;
freopen("gift.in","r",stdin);
freopen("gift.out","w",stdout);
scanf("%d",&n);
for(k=1;k<=n;k++)
{
scanf("%d",&tmp);
if(tmp>19920726)
{
n--;
k--;
}
else
{
data[k]=tmp;
}
}
calculate(1,0,0);
printf("%d\n",min);
return 0;
}
全部回答
- 1楼网友:大漠
- 2021-03-26 13:31
我怀疑这题是出自“0726 G4生日练习赛”,我今天刚好在做这个。
我写了个dp的程序,不过我这程序既超时又超内存。
官方的题解是:
Gift的做法:把数组分成前后两半,分别计算前后两半的可取值(不会超时的,O(2^15)),把右边可取值排序(O(log(2^15)*2^15)=O(15*2^15),再枚举左边的可取值,二分查找就可以了
我写了个dp的程序,不过我这程序既超时又超内存。
官方的题解是:
Gift的做法:把数组分成前后两半,分别计算前后两半的可取值(不会超时的,O(2^15)),把右边可取值排序(O(log(2^15)*2^15)=O(15*2^15),再枚举左边的可取值,二分查找就可以了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯