您的位置:首页 > 其它

Nyoj 860 又见01背包[背包变形]

2013-11-03 16:36 155 查看
一、先总结周赛。

第一,思路的全面性,这次真的做的比较好,考虑的比较周全。

第二,思路的真确性,全面性固然的必须的,但是,正确性更加重要,这是我这次犯的最大的错误,想当然的认为自己的那一点是正确的。直接悲剧到最后。

第三,头脑的灵活,我越发的发现自己太固执了,以至于我都有点呆板了,我擦,这是相当的不好的。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;
}


好好反思自己的这次的失败。

三、还有一个问题,被我提出来了。

我们怎样把已经学过的知识与相似的知识进行转化,能够把学过的知识和其相似的知识点能过转化。达到,没有学过,但是也是可以想到的。这个问题很的值得去思考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: