#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1, s2;
getline(cin, s1);
getline(cin, s2);
int i = s1.size();
int j = 0;
for (j = 0; j < i; j++)
{
if (s2.find(s1[j]) == -1)
//找到返回该元素,没有找到返回-1
cout << s1[j];
}
cout<<endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int n, sum;
cin >> n >> sum;
int* a = new int[n + 1];
a[0] = 0;
for (int i = 1; i <= n; i++)
cin >> a[i];
long **dp = new long *[n + 1];
for (int i = 0; i < n + 1; i++)
dp[i] = new long[sum + 1];
for (int i = 0; i <= n; i++)
for (int j = 0; j <= sum; j++)
dp[i][j] = 0;
for (int j = 0; j <= sum; j++)
dp[0][j] = 0;
for (int i = 0; i <= n; i++)
dp[i][0] = 1;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= sum; j++)
{
if (j >= a[i])
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - a[i]];
else
dp[i][j] = dp[i - 1][j];
}
}
cout << dp[n][sum] << endl;
for (int i = 0; i <= n; i++)
delete[]dp[i];
delete[]dp;
return 0;
}
设f(x)=4x+3,g(x)=8x+7。
计算可以得到以下两个规律:
(1) g(f(x))=f(g(x)) 即f和g的执行顺序没有影响。
(2) f(f(f(x)))=g(g(x)) 即做3次f变换等价于做2次g变换
由于规律(1) 对于一个可行方案,我们可以调整其变换的顺序。如ffggfggff,我们可以转化成 fffffgggg。
由于规律(2),并且为了使执行次数最少,每3个f我们可以转化成2个g,如方案fffffgggg,可以转化成ffgggggg。
因此一个最优的策略,f的执行次数只能为0,1,2。对于输入的x,我们只需要求x,4x+3,4(4x+3)+3的最小g执行次数就可以了。