ZCMU - 1166: 忠哥的dp(II)

原创 2018年04月16日 23:41:37

题目链接:点击打开链接


题目大意:略。


解题思路:完全背包。


AC 代码

#include<bits/stdc++.h>

#define mem(a,b) memset(a,b,sizeof a);

using namespace std;

typedef long long ll;

const int maxn=10000+10;
int dp1[maxn],dp2[maxn];
int weight[maxn];

int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=0;i<n;i++) scanf("%d",&weight[i]);
        for(int i=0;i<maxn;i++)
        {
            dp1[i]=maxn;
            dp2[i]=-maxn;
        }
        dp1[0]=dp2[0]=0;

        for(int i=0;i<n;i++)
        {
            for(int j=weight[i];j<=m;j++)
            {
                // PS1:加判断状态是否可转移(dp[m]一定代表正好背包放满的状态的值):因为for_j循环体内,每一种可能,都要经过判断,当前状态是否可转移,若可以,则调用max,否则跳过当前状态,进入下一种状态。
                // PS2:不加判断状态是否可转移(dp[m]不一定代表正好背包放满的状态的值):因为 j 代表每一种可能性,并不代表一个确定的使用空间的量,所以 dp[m] 到最后可能是一个虚值,但是如果dp初始化时,是个负大值(注意:这个负数要足够大,使虚值到达不了正数,否则会与真值混乱),dp[m] 最终且大于0,则该 dp[m] 是真实值。
                if(j==weight[i] || dp1[j-weight[i]]!=maxn)
                    dp1[j]=min(dp1[j],dp1[j-weight[i]]+1);
                if(j==weight[i] || dp2[j-weight[i]]!=-maxn)
                    dp2[j]=max(dp2[j],dp2[j-weight[i]]+1);
            }
        }

        printf(dp1[m]==maxn?"-1":"%d",dp1[m]);
        printf(dp2[m]<=0?" -1\n":" %d\n",dp2[m]); // 临界点是 dp2[m]>0 而不是 dp2[m]==-maxn

//        if(dp2[m]>0) // 因为最大值有符合的值,那么最小值肯定有,大不了最小值==最大值
//			printf("%d %d\n",dp1[m],dp2[m]);
//		else // 最大值都小于等于0,那么最小值肯定也没有
//			printf("-1 -1\n");
    }

    return 0;
}
版权声明: https://blog.csdn.net/Dream_Weave/article/details/79968590

ZCMU-1165-dp

1165: 忠哥的dp(I) Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 94  Solved: 30 [Submit][Status][Web ...
  • ZCMUCZX
  • ZCMUCZX
  • 2016-12-30 11:14:17
  • 221

ZCMU-1138-松哥的困惑IV

1138: 松哥的困惑IV Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 143  Solved: 50 [Submit][Status][We...
  • ZCMUCZX
  • ZCMUCZX
  • 2017-01-10 10:50:04
  • 240

ZCMU—1111

1111: 松哥的困惑II Time Limit: 5 Sec  Memory Limit: 128 MB [Submit][Status][Web Board] Description ...
  • jnxxhzz
  • jnxxhzz
  • 2016-12-28 19:24:31
  • 240

ZCMU-1140-松哥

1140: 松哥的困惑VI Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 210  Solved: 51 [Submit][Status][Web ...
  • ZCMUCZX
  • ZCMUCZX
  • 2016-12-30 09:20:00
  • 508

HDU 4513 吉哥系列故事――完美队形II(Manacher)

题目链接:[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher V - 吉哥系列故事――完美队形II题意   吉哥又想出了一个新的完美队形游戏!   假设有n个...
  • to_be_better
  • to_be_better
  • 2016-02-19 12:55:32
  • 5990

[LeetCode]Jump Game II(贪心&&DP!!!!!)

Given an array of non-negative integers, you are initially positioned at the first index of the a...
  • whzyb1991
  • whzyb1991
  • 2015-07-18 13:27:47
  • 477

Jump Game II [leetcode] DP的两种思路

第一种思路是: dp(i):到位置i所需要的最少步数 dp(i)一定是递增的,所以从j=A[i]开始(从最远的位置开始),更新数组直到dp(j+i) 如果去掉,会TLE int jump(int A...
  • PeerlessBloom
  • PeerlessBloom
  • 2014-09-16 00:35:05
  • 1161

hdu 4513 吉哥系列故事――完美队形II (Manacher)

题意: 给出一个队列,求出这个队列满足既是回文并且左断点到终点是成递增的最长子队列。 题解: dp,kmp,Manacher,都可以解决。Manacher最高效。 #include #incl...
  • My_ACM_Dream
  • My_ACM_Dream
  • 2015-02-13 20:05:03
  • 900

第五届山东省ACM Hearthstone II(Dp)

Hearthstone II n场比赛,m个场地,m dp[i][j]表示:前i场比赛用了j个场地的情况数 dp[i][j]=dp[i-1][j]*j+dp[i-1][j-1]*(m-...
  • u014665013
  • u014665013
  • 2016-05-11 22:41:07
  • 551

ZCMU-1107: 迟来的A+B

解决思路 原先以为很简单,随手写了一个,但是TLE,然后仔细看了一下题目,看到了dp小王子,那这道题就和动态规划有关,我就用两个数组,把sum的两个组成部分都通过递推存到数组里面,然后查询的时候直接...
  • Geralt_tyh
  • Geralt_tyh
  • 2017-07-26 21:19:38
  • 158
收藏助手
不良信息举报
您举报文章:ZCMU - 1166: 忠哥的dp(II)
举报原因:
原因补充:

(最多只允许输入30个字)