poj1276

    xiaoxiao2021-03-25  85

    #include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<vector> #include<set> #include<queue> using namespace std; int cash[100005]; int main() { int money,n,ta,tb; while(scanf("%d",&money)!=EOF) { scanf("%d",&n); memset(cash,0,sizeof(cash)); for(int i=0; i<n; ++i) { scanf("%d%d",&ta,&tb); for(int j=money; j>=tb; j--) { for(int i=1; i<=ta&&j>=i*tb; ++i) { cash[j]=max(cash[j],cash[j-i*tb]+i*tb); } } } cout<<cash[money]<<endl; } return 0; }

    以上代码是简单的多重背包转01背包计算。

    很容易就超时了,学习了二进制优化。

    本质上还是01背包,只不过这一次是,不拿,或者拿1,2,4,8,16,32....2^n,

    注意:最后有不被2分解的数。

    #include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<vector> #include<set> #include<queue> using namespace std; int cash[100005]; int main() { int money,n,ta,tb; while(scanf("%d",&money)!=EOF) { scanf("%d",&n); memset(cash,0,sizeof(cash)); for(int i=0; i<n; ++i) { scanf("%d%d",&ta,&tb); for( int i=1; i<ta; i*=2) { for(int j=money; j>=i*tb; j--) { cash[j]=max(cash[j],cash[j-i*tb]+i*tb); } ta-=i; } for(int j=money; j>=ta*tb; j--) { cash[j]=max(cash[j],cash[j-ta*tb]+ta*tb); } } cout<<cash[money]<<endl; } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-34523.html

    最新回复(0)