1.
P1776
思路:首先我写了个简单的多重背包的模板,发现过不了,然后理解多重背包的本质,用二进制优化。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxx=10000;
int v,w,m,n,T;
int dp[100000];
int main(){
cin>>n>>T;
for(int i=1;i<=n;i++){
cin>>v>>w>>m;
int ce=20;
int V[20],W[20];
if(m==1){
for(int j=T;j>=w;j--){
dp[j]=max(dp[j],dp[j-w]+v);
}
continue;
}
int cnt=0;
for(int o=0;o<=20;o++){
if(m>=pow(2,o)){
W[++cnt]=w*pow(2,o);
V[cnt]=v*pow(2,o);
m-=pow(2,o);
//cout<<"over "<<pow(2,o)<<endl;
}
else break;
}
if(m)V[++cnt]=v*m,W[cnt]=w*m;
for(int k=1;k<=cnt;k++){
for(int j=T;j>=W[k];j--){
dp[j]=max(dp[j],dp[j-W[k]]+V[k]);
}
}
}
cout<<dp[T]<<endl;
return 0;
}
2.
P1555
思路:简单的循环。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
string n,m;
cin>>n>>m;
int lenn=n.length();
int lenm=m.length();
for(int i=0;i<lenn;i++){
int ansn=0;
for(int k=0;k<lenn;k++){
if(k==i){
if(n[k]=='1')ansn+=0;
else ansn+=pow(2,lenn-k-1);
}
else ansn+=pow(2,lenn-k-1)*(n[k]-'0');
}
for(int j=0;j<lenm;j++){
for(int h=1;h<=2;h++){
int ansm=0;
for(int k=0;k<lenm;k++){
if(k==j){
ansm+=pow(3,lenm-k-1)*(((m[k]-'0')+h)%3);
}
else ansm+=pow(3,lenm-k-1)*(m[k]-'0');
}
if(ansm==ansn){
cout<<ansn;
return 0;
}
}
}
}
return 0;
}
3.
P8845
思路:这两个数就是2和3啦。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
if(x==1&&y==2)cout<<"Yes\n";
else if(x==2&&y==1)cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}