砝码问题(贪心+dp)

传送门

这个题是一个二进制模拟

现在有好多种砝码,他们的重量是 w0,w1,w2,...  每种各一个。问用这些砝码能不能表示一个重量为m的东西。

样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中。

 

输入

单组测试数据。
第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9)。

输出

如果能,输出YES,否则输出NO。

输入样例

3 7

输出样例

YES

将所有的砝码重量看成W进制数,则多个砝码的重量和为1,0组成的w进制数。
而本题可将问题转换成m是否可以表示成两个由01组成的w进制数的差
两个01组成的数相差即只有下面四种情况:
0-0=0, 1-0=1, 0-1=w-1(向高位错一后) 1-1=0
(注:每个砝码只有一个,故01组成的数,中每一位只有一个为1,另一个为0,例如1010,0101)

这个题就是你可以用10进制来模拟一下,例如891,就是1001-110,自己模拟一下就行

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=3e6+100;
int w,m;
int main(){
    cin>>w>>m;
    while(m){
        if(m%w==1||m%w==0){
            m=m/w;
        }
        else if(m%w==w-1){
            m=m/w+1;
        }
        else{
            cout<<"NO"<<endl;
            return 0;
        }
    }
    cout<<"YES"<<endl;
}

传送门

你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1,W2,,WN

请你计算一共可以称出多少种不同的正整数重量?

注意砝码可以放在天平两边。

输入格式

输入的第一行包含一个整数 N

第二行包含 N 个整数:W1,W2,W3,,WN

输出格式

输出一个整数代表答案。

数据范围

对于 50% 的评测用例,1N15
对于所有评测用例,1N100NN 个砝码总重不超过 1e5

输入样例:

3
1 4 6

输出样例:

10

样例解释

能称出的 1010 种重量是:1234567910111、2、3、4、5、6、7、9、10、11。

1 = 1;
2 = 6 − 4 (天平一边放 6,另一边放 4);
3 = 4 − 1;
4 = 4;
5 = 6 − 1;
6 = 6;
7 = 1 + 6;
9 = 4 + 6 − 1;
10 = 4 + 6;
11 = 1 + 4 + 6。

这个题是一个dp的题,dp[i][j]指的是前i个能不能组成j这个砝码

#include<iostream>
#include<algorithm>
using namespace std;
int dp[110][100010];
int a[1011];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    dp[1][a[1]]=1;
    for(int i=2;i<=n;i++){
        for(int j=1;j<=100001;j++){
            if(dp[i-1][j]){
                dp[i][j]=1;
                dp[i][abs(j-a[i])]=1;
                dp[i][j+a[i]]=1;
            }
        }
        dp[i][a[i]]=1;
    }
    int ans=0;
    for(int i=1;i<=100001;i++){
        if(dp[n][i]){
            ans++;
        }
    }
    cout<<ans<<endl;
} 

 

 

posted @ 2021-05-02 21:19  lipu123  阅读(239)  评论(0编辑  收藏  举报