记忆化搜索全RE,看看是哪里错了

P1060 [NOIP2006 普及组] 开心的金明

@[caojiaming](/user/775551) 不用记忆化也能过
by da_ke @ 2023-05-16 22:36:11


我也是记忆化搜索,50pts ```c #include <stdio.h> #define max(a,b) (a)>(b)?(a):(b) long long v[28],p[28],mem[28][30001]; long long dp(int x,int s) { if(mem[x][s]!=0) return mem[x][s]; if(x==0) { if(v[0]>s) { return 0; } return v[0]*p[0]; } if(v[x]>s) { mem[x-1][s]=dp(x-1,s); return mem[x-1][s]; } if(mem[x-1][s-v[x]]==0) mem[x-1][s-v[x]]=v[x]*p[x]+dp(x-1,s-v[x]); if(mem[x-1][s]==0) mem[x-1][s]=dp(x-1,s); return max(mem[x-1][s-v[x]],mem[x-1][s]); } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { scanf("%lld%lld",&v[i],&p[i]); } printf("%lld\n",dp(m-1,n)); return 0; } ``` 一起求调
by Jianbing_Juan @ 2023-07-07 01:03:34


@[Jianbing_Juan](/user/940854) 这题用大暴搜似乎也能过 ```cpp #include<iostream> using namespace std; int n,m,v[30],p[30],ans; void search(int money,int k,int nans) { if(money>n) return; if(k==m+1) { ans=max(ans,nans); return; } search(money,k+1,nans); search(money+v[k],k+1,nans+v[k]*p[k]); } int main() { cin>>n>>m; for(int i=1; i<=m; i++) cin>>v[i]>>p[i]; search(0,1,0); cout<<ans<<endl; return 0; } ```
by awawawawa @ 2023-08-20 15:30:25


@[awawawawa](/user/753880) 这个题我已经过了,dp用函数递归的话转移应该容易挂。后来我改循环了
by Jianbing_Juan @ 2023-08-21 00:02:23


|