蓝桥杯 算法提高 拿糖果 完全背包变形

一开始把题理解错了,以为m=n,就筛了下质因数,数量不多直接暴力判断了;交了一发只过了50%...代码如下:

#include
#include
#include
#include
#include
#include
#define pk push_back
using namespace std;
const int INF=0x3f3f3f3f;

const int MAX=100005; //100005
int n;
int eul[MAX];
bool vis[MAX];
vectorvt[MAX];
void getEul()
{
    for(int i=0;isqrt(1.0*n))
                break;
            int t=n/k;
            if(t%2)
                t--;
            t/=2;
            ans=max(ans,t*k);
        }
        printf("%d\n",ans);
    }
	return 0;
}

再看一遍题才发现m是一直变化的。。果然还是太菜了55555...怎么都想不到是个背包问题。。后来在大佬的提醒下,发现可以这么想:背包是给定一个容量,往里放物品,最多能放多少;这道题是给定一个总量,往出取物品,最多能取多少。所以就是个背包问题,再一想,是个完全背包。那么就把每个质因数当作一个物品,但要判断能不能用(即能否被整除)。100%代码如下:

#include
#include
#include
#include
#include
using namespace std;

const int MAX=100005;
int n;
bool vis[MAX];
int pri[MAX];
void getPri() //素数筛选
{
    memset(pri,0,sizeof(pri));
    memset(vis,false,sizeof(false));
    for(int i=2;isqrt(1.0*n))
                break;
            int ci=2*pri[i];//注意×2!
            for(int j=ci;j<=n;j++)//完全背包
            {   //容量为j的时候取多少
                if(j%pri[i]==0)//是j的质因子,能用
                    dp[j]=max(dp[j],dp[j-ci]+pri[i]);
            }
        }
        printf("%d\n",dp[n]);
    }
	return 0;
}

 

你可能感兴趣的:(#,动态规划)