P2340 [USACO03FALL]Cow Exhibition G
情商和智商和,这不就是个背包
怎样保证大于零呢,我们吧一个商作为维度存进去,另外一个商就是我们转移的值了
然后,直接背包
最后检查所有大于零的部分,统计就可以了
\(dp_i=max(dp_i,dp_{i-s[i]+f_i})\)
注意一下负数要反着转移
然后就可以了
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int f[33];
int n;
int x;
int ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&x);
int k=0;
for(int j=0;j<=30;++j){
if((1<<j)&x) k=max(k,f[j]+1);
}
for(int j=0;j<=30;++j){
if((1<<j)&x) f[j]=max(k,f[j]);
}
ans=max(ans,k);
}
cout<<ans;
return 0;
}