题解 P1164 【小A点菜】
3.10更 改了一个错字
因为这题放在了动态规划的背包问题里,所以很明显是一个01背包
但是,看完数据范围之后,感觉搜索也能过 其实是不会写动规
逛完题解后发现大佬们都是dp或dfs,本蒟蒻就写个bfs献丑了
因为有n<=100种菜品,每种菜都有点或不点两种选择,所以最多会有2^100种情况, 这么长的队列很明显是写不了 但幸亏uim很穷 很多情况下菜还没点几个就没钱了,然后可以直接判断这种情况是否正确,往下的菜单就不必看了,所以实际入队的情况不会有这么多,c++支持的最大一维数组应该是够用的,没想的真的够用
#include<iostream>
#include<cstdio>
using namespace std;
int q[9999999];//队列 也许可以更小一些,没有尝试
int tot[9999999];
int main(){
int n,m,ans=0;
tot[1]=1;
cin>>n>>m;
q[0]=m;
int h=0,t=1;
for(int i=1;i<=n;i++){
int x;
cin>>x;
for(int j=1;j<=tot[i];j++){//把入队的几个全部询问一边
q[t++]=q[h];tot[i+1]++;//入队和记录入队个数
if(q[h]-x==0){
ans++;
}
if(q[h]-x>0){
q[t++]=q[h]-x;tot[i+1]++;//入队和记录入队个数
}
h++;
}
}
cout<<ans;
return 0;
}
我才不会说第一次交的时候数组开太大直接RE了