砝码问题(贪心+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% 的评测用例,1≤N≤15。
对于所有评测用例,1≤N≤100,NN 个砝码总重不超过 1e5。
输入样例:
3
1 4 6
输出样例:
10
样例解释
能称出的 1010 种重量是:1、2、3、4、5、6、7、9、10、111、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; }