每日总结4.2
蓝桥杯刷题:
1.
方格分割(dfs,选中心点,开始上下左右遍历,达到边界时数量加一)
#include <bits/stdc++.h>
using namespace std;
bool vis[10][10];
int mp[10][10];
int ans=0;
int dx[4]={1,0,0,-1};
int dy[4]={0,1,-1,0};
void dfs(int x,int y)
{
if(x==0||y==0||x==6||y==6)
{
ans++;
return;
}
vis[x][y]=true;
for(int i=0;i<4;i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
if(!vis[tx][ty])
{
vis[tx][ty]=true;
vis[6-tx][6-ty]=true;
dfs(tx,ty);
vis[tx][ty]=false;
vis[6-tx][6-ty]=false;
}
}
}
int main()
{
dfs(3,3);
cout<<ans/4;
return 0;
}
2.
日期问题(暴力枚举)
(枚举出1960到2059年的所有日期,判断输入日期是否在里面)
(printf(“%02d”,num) : 输出两位数,位数不够前面补0)
#include <iostream>
using namespace std;
int main()
{
int a,b,c;
scanf("%d/%d/%d",&a,&b,&c);
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(int year=1960;year<=2059;year++)
{
month[2]=28;
if((year%4==0&&year%100!=0)||year%400==0)
{
month[2]=29;
}
for(int i=1;i<13;i++)
{
for(int day=1;day<=month[i];day++)
{
if((year%100==a&&i==b&&day==c)||(i==a&&day==b&&year%100==c)||(day==a&&i==b&&year%100==c))
{
printf("%d-%02d-%02d\n",year,i,day);
}
}
}
}
return 0;
}
3.
包子凑数
(组合,完全背包问题,先遍历物品再遍历背包,正序遍历)
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[100000],a[10000];
int gcd(int x,int y)
{
int cmax=max(x,y);
int num=1;
for(int i=1;i<=cmax;i++)
{
if(x%i==0&&y%i==0)
{
num=i;
}
}
return num;
}
signed main()
{
int n;
dp[0]=1;
cin>>n;
cin>>a[0];
cin>>a[1];
int g;
g=gcd(a[0],a[1]);
for(int i=2;i<n;i++)
{
cin>>a[i];
g=gcd(a[i],g);
}
if(g!=1)
{
cout<<"INF";
return 0;
}
for(int i=0;i<n;i++)
{
for(int j=1;j<=100000;j++)
{
if(j<a[i]){continue;}
else{dp[j]=dp[j]+dp[j-a[i]];}
}
}
int ans=0;
for(int i=1;i<100000;i++)
{
if(dp[i]==0)
{ans++;}
}
cout<<ans;
}
力扣刷题
完全背包问题
1.
518.零钱兑换
(组合,完全背包问题,先遍历物品再遍历背包,正序遍历)
递推公式:dp[j]=dp[j]+dp[j-coins[i]];
int change(int amount, int* coins, int coinsSize) {
uint64_t dp[amount+10];
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=0;i<coinsSize;i++)
{
for(int j=coins[i];j<=amount;j++)
{
dp[j]+=dp[j-coins[i]];
}
}
return dp[amount];
}
2.
416.分割等和子集
bool canPartition(int* nums, int numsSize) {
if (numsSize < 2) {
return false;
}
int sum = 0, maxNum = 0;
for (int i = 0; i < numsSize; ++i) {
sum += nums[i];
maxNum = fmax(maxNum, nums[i]);
}
if (sum & 1) {
return false;
}
int target = sum / 2;
if (maxNum > target) {
return false;
}
int dp[target + 1];
memset(dp, 0, sizeof(dp));
dp[0] = true;
for (int i = 0; i < numsSize; i++) {
int num = nums[i];
for (int j = target; j >= num; --j) {
dp[j] |= dp[j - num];
}
}
return dp[target];
}
417.
3.
494.目标和
(回溯,超时)
int count;
void dfs(int* nums, int numsSize, int target,int num,int sum)
{
if(num==numsSize)
{
if(sum==target)
{count++;}
return;
}
else
{
dfs(nums,numsSize,target,num+1,sum+nums[num]);
dfs(nums,numsSize,target,num+1,sum-nums[num]);
}
}
int findTargetSumWays(int* nums, int numsSize, int target) {
count=0;
dfs(nums,numsSize,target,0,0);
return count;
}