最开始提交的时候,忘记判断strlen(s)>6的情况,考虑不周到,以后一定考虑全面再提交。
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
char s[20],tmp[20]={"jessie"};
scanf("%s",s);
if(strlen(s)==6){
int flag=0;
for(int i=0;i<6;i++){
if(s[i]==tmp[i]-32){
s[i]=tmp[i];
}
else if(s[i]!=tmp[i]){
flag=0;
break;
}
}
if(flag){
printf("Good guy!\n");
continue;
}
}
printf("Dare you say that again?\n");//strlen(s)>6
}
return 0;
}
I Save the Room(规律)
#include<iostream>
using namespace std;
int main()
{
int a, b, c;
while(cin>>a>>b>>c)
{
if((a*b*c)%2!=0)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}
K Transport Ship (多重背包拆分 0-1背包)
1.题意:
有N种船只,每种船只的载货量为v[i],每种船只有2^c[i]-1种,有q次询问,每次问有多少种载货方式填满容量s。
2.思路:
2.1如果用裸的0-1背包的话时间复杂度是O(N*2^c[i]*10000),显然是会超时的,但是我们可以把每一种船只合并,比如船只有2^c[i]-1艘的话,就拆成2^0+2^1+2^2+...+2^(c[i]-1)。(2^0+2^1+2^2+...+2^(c[i]-1)这个等比数列的和,就是2^c[i]-1)1~2^c[i]-1的任意一个数都可以由拆分出来的数组成,将所有合并后的结果进行一次01背包即可。
2.2拆分举例:有15个重量为3的物品,拆分后可以形成:1 2 4 8 四个物品,其重量分别为:1*3 2*3 4*3 8*3 ----对应0-1背包。
3.背包:
3.1背包
3.2 多重背包拆分为0-1背包
4.代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod= 1e9+7;
ll v[25];
ll c[25];
ll dp[10006];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,q;
memset(dp,0,sizeof(dp));
dp[0]=1;
scanf("%d%d",&n,&q);
for(int i=0;i<n;i++){
scanf("%d%d",&v[i],&c[i]);
}
for(int i=0;i<n;i++){
for(int j=0;j<c[i];j++){
ll val=v[i]<<j;
for(int k=10006;k>=val;k--){//装满k,k是背包容量
dp[k]=dp[k]+dp[k-val];
dp[k]%=mod;
}
}
}
while(q--){
int num;
scanf("%d",&num);
printf("%lld\n",dp[num]);
}
}
return 0;
}