首页 > 其他分享 >POJ1837 DP

POJ1837 DP

时间:2023-06-12 14:36:49浏览次数:39  
标签:balance 21 weight int POJ1837 DP include dp


POJ1837 DP题

题目一开始看了N久…意思大概是有一个天平,左边臂长是-15到0,右边臂长是0到15,给你c个挂钩,g个砝码,每一个砝码重量都在1到25,问将所有砝码挂到天平上并使之平衡的方案有多少个。
要使之平衡由物理知识可知力矩=0,左边重量 X 左边臂长+右边重量 X右边臂长=0,故状态一共有25*15*20=7500,设dp[i][j]为将前i个砝码挂上去平衡点为j的方案,同时注意因为这题有负数,所以将坐标轴移动到0到15000,初始化dp[0][7500]=1

Description

Gigel has a strange “balance” and he wants to poise it. Actually, the device is different from any other ordinary balance.
It orders two arms of negligible weight and each arm’s length is 15. Some hooks are attached to these arms and Gigel wants to hang up some weights from his collection of G weights (1 <= G <= 20) knowing that these weights have distinct values in the range 1..25. Gigel may droop any weight of any hook but he is forced to use all the weights.
Finally, Gigel managed to balance the device using the experience he gained at the National Olympiad in Informatics. Now he would like to know in how many ways the device can be balanced.

Knowing the repartition of the hooks and the set of the weights write a program that calculates the number of possibilities to balance the device.
It is guaranteed that will exist at least one solution for each test case at the evaluation.

Input

The input has the following structure:
• the first line contains the number C (2 <= C <= 20) and the number G (2 <= G <= 20);
• the next line contains C integer numbers (these numbers are also distinct and sorted in ascending order) in the range -15..15 representing the repartition of the hooks; each number represents the position relative to the center of the balance on the X axis (when no weights are attached the device is balanced and lined up to the X axis; the absolute value of the distances represents the distance between the hook and the balance center and the sign of the numbers determines the arm of the balance to which the hook is attached: ‘-’ for the left arm and ‘+’ for the right arm);
• on the next line there are G natural, distinct and sorted in ascending order numbers in the range 1..25 representing the weights’ values.

Output

The output contains the number M representing the number of possibilities to poise the balance.

Sample Input

2 4
-2 3
3 4 5 8

Sample Output

2

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

int dp[21][15002];

int main()
{
    int c,g;
    while (scanf("%d%d",&c,&g)!=EOF)
    {
        int post[21];
        int weight[21];
        for (int i =1 ;i<=c;i++)
           scanf("%d",&post[i]);
        for (int i = 1;i<=g;i++)
            scanf("%d",&weight[i]);
        memset(dp,0,sizeof(dp));
        dp[0][7500] = 1;                //将平衡点右移,使之没负数情况

        for (int i = 1;i<=g;i++)
          for (int j = 0;j<=15000;j++)
            {
             for (int k = 1;k<=c;k++)
              if (j >= post[k] * weight[i])
                 dp[i][j]+=dp[i-1][j-post[k]*weight[i]];
            }
        printf("%d\n",dp[g][7500]);
    }
}

上面的程序跑了94MS,尝试优化了一下变成了47MS,其实只是两个循环换了一下位置

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

int dp[21][15002];

int main()
{
    int c,g;
    while (scanf("%d%d",&c,&g)!=EOF)
    {
        int post[21];
        int weight[21];
        for (int i =1 ;i<=c;i++)
           scanf("%d",&post[i]);
        for (int i = 1;i<=g;i++)
            scanf("%d",&weight[i]);
        memset(dp,0,sizeof(dp));
        dp[0][7500] = 1;                //将平衡点右移,使之没负数情况

        for (int i = 1;i<=g;i++)
          for (int k = 1;k<=c;k++)
            for (int j = 15000;j>=post[k]*weight[i];j--)
            {
                 dp[i][j]+=dp[i-1][j-post[k]*weight[i]];
            }
        printf("%d\n",dp[g][7500]);
    }
}

再看看大牛的..跑了0MS….

#include <iostream>
using namespace std;

int dp[21][20000];

int main(){
    int i,j,k,C,G;

    int pos[21],wight[21];
    while(scanf("%d%d",&C,&G)!=EOF){
        for(i=1;i<=C;i++)
            scanf("%d",&pos[i]);
        for(i=1;i<=G;i++)
            scanf("%d",&wight[i]);

        memset(dp,0,sizeof(dp));
        dp[0][10000]=1;

        for(i=1;i<=G;i++)
            for(j=0;j<=20000;j++)
                if(dp[i-1][j]){
                    for(k=1;k<=C;k++)
                        dp[i][j+pos[k]*wight[i]]+=dp[i-1][j];
                }

        printf("%d\n",dp[G][10000]);
    }
    return 0;
}


标签:balance,21,weight,int,POJ1837,DP,include,dp
From: https://blog.51cto.com/u_16156555/6462536

相关文章

  • CodeForces 4D Mysterious Present(DP)
    题意:你有一张长宽为x,y的卡片同时有n个盒子,长宽分别为xi,yi。然后问你卡片最多塞多少层盒子并且把这些盒子按照从里到外输出。思路:由于数据给小了,所以n^2的DP也是可以水过的~#include<iostream>#include<cstdio>usingnamespacestd;constintmaxn=5005;intx[maxn],y[maxn]......
  • hdu2084数塔(DP)
    思路:简单的数塔DP#include<stdio.h>#include<string.h>#include<algorithm>usingnamespacestd;inta[105][105],dp[105][105];intmain(){intt,n,i,j;scanf("%d",&t);while(t--){scanf("%d",......
  • LightOJ 1422 Halloween Costumes (区间DP)
    题意:你要连续去很多个舞会,给出n个舞会你需要穿的衣服的编号,一旦脱下就不能再穿,但是可以一件套一件,问最少需要准备多少件衣服。思路:区间DP,令dp[i][j]为第i到第j天需要的衣服,那么对于第i天,如果考虑后面没有和它重复的话,那么dp[i][j]=dp[i+1][j]+1,如果存在某一天a[i]==a[k],dp[i][j]=......
  • HDU 5489 Removed Interval(DP)
    题意:求去掉某一个长度为L的子串的LIS思路:画画图其实比较显然的想法是去掉这个区间的时候答案是右边以第一个数开头的LIS+左边最后一个数小于右边第一个数的LIS,为什么是右边以第一个数开头的LIS呢,因为如果是在这个L的后第二个是最佳答案的话那么我在这个“窗口”滑到L+1这个位置的时......
  • HDU 5492 Find a path(DP)
    思路:将式子化开其实就是求(n+m-1)*s1-s2的最小值,s1表示各个格子的平方和,s2表示和的平方,留意到数据范围较小,令dp[i][j][k]为走到第i行第j列当前和为k的平方和的最小值,最后答案就是(n+m-1)*dp[i][j][k]-k*k#include<bits/stdc++.h>usingnamespacestd;#defineinf1e9inta[33][3......
  • TCP 协议快被淘汰了,UDP 协议才是新世代的未来?
    TCP协议可以说是今天互联网的基石,作为可靠的传输协议,在今天几乎所有的数据都会通过TCP协议传输,然而TCP在设计之初没有考虑到现今复杂的网络环境,当你在地铁上或者火车上被断断续续的网络折磨时,你可能都不知道这一切可能都是TCP协议造成的。本文会分析TCP协议为什么在弱网环......
  • 一文了解CDP
    传统营销模式下,我们越来越缺流量,流量也越来也贵;本质上,不是流量真的变少了,而是触点的碎片化,甚至粉末化;广告触达了一部分目标用户,或者顾客光临了店铺(无论线上或线下),已经产生了兴趣,甚至已有明确的意向,或者已经产生了消费,但是,我们既不知道这些用户具体是茫茫人海中哪一位,更无法主动再次......
  • C# 获取系统DPI缩放比例以及分辨率大小
    一般方法System.Windows.Forms.Screen类 //获取当前主屏幕分辨率 intscreenWidth=Screen.PrimaryScreen.Bounds.Width; intscreenHeight=Screen.PrimaryScreen.Bounds.Height;   //获取指定屏幕分辨率 ScreensecondaryScreen=Screen......
  • xrdp远程登陆服务器配置
    如何使用rdp远程Linux(CentOS)的图形化桌面原创 李德荣 EDA运维 2023-04-2721:57 发表于上海收录于合集#软件11个#服务器15个#电脑41个#IT50个#网络21个概述本篇文章以CentOS7.9和CentOSStream9为例,通过安装xrdp组件实现远程登陆实现方案......
  • SpringBoot自带ThreadPoolTaskScheduler实现数据库管理定时任务
    最近做了一个需求:将定时任务保存到数据库中,并在页面上实现定时任务的开关,以及更新定时任务时间后重新创建定时任务。于是想到了SpringBoot中自带的ThreadPoolTaskScheduler。在SpringBoot中提供的ThreadPoolTaskScheduler这个类,该类提供了一个schedule(Runnabletask,Triggert......