一、先总结周赛。
第一,思路的全面性,这次真的做的比较好,考虑的比较周全。
第二,思路的真确性,全面性固然的必须的,但是,正确性更加重要,这是我这次犯的最大的错误,想当然的认为自己的那一点是正确的。直接悲剧到最后。
第三,头脑的灵活,我越发的发现自己太固执了,以至于我都有点呆板了,我擦,这是相当的不好的。5个小时,我没有在开新题,这个问题是相当的严重的。
二、B题 打开链接
这题,一看我擦,小兴奋,简单的01背包。又一看数据范围,黑了我一脸。最大价值是10^9,这咋开数组?好吧,果断先不写,去找好的题(简单)。
比赛5个小时,被我卡在了5个小时的F题,需要极大的反思。
比赛完在看这题,我真的傻了。没有仔细的观察数据。还有对动态规划的羸弱。对背包的羸弱。
思路,如果仔细观察数据可以看出,可以获得的最大价值是比较小的。那么可以对价值和重量来进行互换位置,各种体味自己理解。
不说什么,直接代码:
#include<cstdio>
#include<cstring>
#define Min(a,b) a>b?b:a
using namespace std;
const int W=10005;
int dp[W];
//W太大
int main()
{
// freopen("input.txt","r",stdin);
int n,w;
while(scanf("%d%d",&n,&w)!=EOF)
{
int sumv=0,a[W],b[W];
memset(dp,'a',sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++)
{scanf("%d%d",&a[i],&b[i]);sumv+=b[i];}
for(int i=1;i<=n;i++)
for(int j=sumv;j>=b[i];j--)
dp[j]=Min(dp[j],dp[j-b[i]]+a[i]);
int max=0;
for(int i=sumv;i>=0;i--)
if(dp[i]<=w) {max=i;break;}
printf("%d\n",max);
}
return 0;
}
好好反思自己的这次的失败。
三、还有一个问题,被我提出来了。
我们怎样把已经学过的知识与相似的知识进行转化,能够把学过的知识和其相似的知识点能过转化。达到,没有学过,但是也是可以想到的。这个问题很的值得去思考。