Week 12

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

[传智杯 #4 初赛] 小卡和质数

思路:这两个数就是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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值