首页 > 其他分享 >ZCMU-1149

ZCMU-1149

时间:2024-05-31 15:46:26浏览次数:8  
标签:背包 int 1149 ZCMU 01 maxm dp

image
image

就是背包01问题


#include<iostream>
#include<cstring>
/*01背包问题*/ 
using namespace std;
const int maxn =  120;
const int maxm = 1e5 + 10;
int dp[maxm],a[maxm];
int n,m;
int main()
{
    int t; cin>>t;
    while(t--)
    {
        cin>>n;
        int sum=0;
        //dp[j]表示在j范围下的最多可以有多少 
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
        //外层遍历物品 
        for(int i=1;i<=n;i++)
        {
        	//内层遍历背包 
            for(int j=sum/2;j>=a[i];j--)
            {
            	//递推公式,后面为当前减少a[i]的背包装的最大情况 
                dp[j] = max(dp[j],dp[j-a[i]]+a[i]); 
                //因为是一物品来判断的所以不能正向遍历
				//那样会出现重复利用的情况,且小背包用来大背包是不能使用的 
            }
        }
        cout<< sum - 2*dp[sum/2] <<endl;
    }
    return 0; 
}

标签:背包,int,1149,ZCMU,01,maxm,dp
From: https://www.cnblogs.com/hai-zei/p/18224670

相关文章

  • ZCMU-1144
    简单问题:就只是如何降低时间的问题罢了:本来这种方法以前学过但是没怎么用所以不太灵活、#include<stdio.h>#definemaxn1000010intsum[maxn]={0};voidSum(){ for(inti=1;i<=maxn;i++){for(intj=i;j<=maxn;j+=i){sum[j]++;//表示......
  • ZCMU-1120
    就这样#include<cmath>#include<cstdio>#include<iostream>usingnamespacestd;intmain(){inti,k,sum;while(~scanf("%d",&k)){i=0,sum=0;k=abs(k);//前面设置成0的所以//先加后用while(+......
  • ZCMU-1179
    我的错误:明知道是大数问题但不是不想写数组或者字符串的结构。思路网上查阅后发现可以使用JAVA的大数类型做。若不使用JAVA则就是整型数组或者字符串的情况。将a^b结果放在数组当中,实时更新数组,每次用a去乘当前数组,记得加长。因为上面情况得到的结果是倒序的不方便比......
  • 洛谷[普及]:P1149 [NOIP2008 提高组] 火柴棒等式
    [NOIP2008提高组]火柴棒等式感谢题目提供者CCF_NOI题目描述给你n 根火柴棍,你可以拼出多少个形如A+B=C 的等式?等式中的A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字 的拼法如图所示:注意:1.加号与等号各自需要两根火柴棍;2.如果,则......
  • ZCMU-1156
    思路:要改变的是一个范围的情况,所以正常情况下会超时。查阅后知道应该用一个叫做树状数组的结构。查阅和树状数组的后续情况这个也不错注意:我没怎么看懂,可能没太仔细看。树状数组当中存在的是前后的差,所以每次变动只是在start,end+1变动.因为一直上去的是lowbi......
  • ZCMU-1153
    思路一个感觉是规律问题的数学问题因为输入的是n所以要的出有关n的关系或者关系有关排序,所以可以从位次入手,设双胞胎前一个位置在ai,后一个在bi.Sum(bi-ai)=(2+3+4+5+6+...+n+1)=(1+2+3+4+5+6+...+n)+n*1=((n+1)*n)/2+n;Sum(ai+bi)=(1+2+3+4+....+2n)=((1+2n)*(2*n))/2......
  • ZCMU-1136
    思路一个数学问题要知道1为奇数,2^x次方一定为偶数。偶数=奇数+奇数,而奇数=奇数*奇数,所以x一定要是奇数才可以。注意没告诉范围所以要往大的方向考虑其中1能够被任一整数整除,所以前面加上对1的判断参考(费马小定理)#include<stdio.h>intmain(){inti,n,temp......
  • ZCMU-1111
    与背包和动态规划有关(我认为)采用dp数组存放吃掉i千克食物要用掉的钱dp最开始要尽量的大方便过程中判断和最后的输出判断实时更新dp,保留最小的钱以前不知道的printf函数可以这样用fill函数填充数组,(开始,结束,填充值);C和C++结构体里面可以放函数学习#include<c......
  • ZCMU-1129
    数学公式题罢了学长1.斯特灵公式:2.对数公式(因为以10为底,得到的是10^x,所以最后向下取整加上1);#include<cstdio>#include<cmath>usingnamespacestd;constdoublePI=acos(-1);constdoublee=exp(double(1));intstr(intn){returnfloor(log10(sqrt(2*PI*n))+......
  • ZCMU-1110
    思路:-首先可以知道最少动就是从三个角对称的划分因为不是对称划分则会出现破坏了正三角,后面还要重新对好之后就可以进行推导(按三角形我没看懂)其中设底上截出来的三角形的底为i,则上面就是n-2*i-1;所以动的数就可以算出来:[6*i^2+(4-4n)i+(n*n-n)]/2;最小就是i=(......