Poj1837 Balance 动态规划-01背包

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

思路:

第一次做背包的题,感觉不是很好想...此类问题的关键在于找到状态转移方程

F[i][j]用来表示将前i个物品放上钩,使力矩为j的情况数

状态转移方程:F[i][j]=F[i][j]+F[i][j-temp]  (if F[i][j-temp]>=1)

其中,temp枚举第i个物品的每一个力矩。

代码:

#include<iostream>
using namespace std;
int n[100], m[100];
int F[20][100000];
int main()
{
    int C, G;
    scanf("%d%d", &C, &G);
    for (int i = 0; i < C; i++)scanf("%d", &n[i]);
    for (int i = 0; i < G; i++)scanf("%d", &m[i]);
    for (int i = 0; i < C; i++) {
        int temp = n[i] * m[0];
        F[0][temp + 8000] = F[0][temp + 8000]+1;
    }
    for (int i = 1; i < G; i++)
    {
        for (int j = 0; j < C; j++)
        {
            int temp = n[j] * m[i];
            for (int k = 0; k < 100000; k++)
            {
                if (F[i - 1][k]>=1) F[i][k + temp] = F[i][k+temp]+F[i-1][k];
            }
        }
    }
    printf("%d", F[G - 1][8000]);
}
时间: 2024-10-12 23:59:05

Poj1837 Balance 动态规划-01背包的相关文章

动态规划/0-1背包

每年毕业的季节都会有大量毕业生发起狂欢,好朋友们相约吃散伙饭,网络上称为"bg".参加不同团体的bg会有不同的感觉,我们可以用一个非负整数为每个bg定义一个"快乐度".现给定一个bg列表,上面列出每个bg的快乐度.持续长度.bg发起人的离校时间,请你安排一系列bg的时间使得自己可以获得最大的快乐度.    例如有4场bg:    第1场快乐度为5,持续1小时,发起人必须在1小时后离开:    第2场快乐度为10,持续2小时,发起人必须在3小时后离开:    第3场快

动态规划01背包记录

01背包是动态规划的一种类型其主要的形式是: 1.所有类型物品每种类型只有一个 2.一次只能取一个且物品不能分割 3.只有取或者不取(所以叫01背包,就是只有这两种情况) 4.在背包容量不满的前提下尽可能多的装入最大价值的物品 设背包的容量为V,第i个物品的重量为weigh[i]对应的价值为price[i];  设容量为j(j的最大值为背包的容量)的背包所能装的最大价值为dp[j] n为所有的物品个数,我们先从第1个数据开始,则此物品重量为weigh[1],则我们将所有大于weigh[1]的背包

[动态规划] 01背包与完全背包

01背包(每种物品的状态为选择或不选择,最多只能选1件): 1.传统的二维数组,第i件物品的重量为w[i],价值为v[i] dp[i][j]保存的是选择前i件物品(每一件物品的状态为选与不选),在背包容量为j的情况下,可以获得的最大价值 两种情况: 一.当前背包容量j<第i件的重量时,第i件背包肯定不能选,放不下去,有dp[i][j]=dp[i-1][j] 二.当前背包容量j>=第i件的重量时,第i件背包可以选,能放得下去,但因为要考虑到所获得最大价值,所以这时候有两种选择,选或不选,我们要在

动态规划--01背包模型

01背包剖析 问题引入 题目来源:ACwing:01背包问题 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次.第 i 件物品的体积是 vi,价值是 wi.求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大.输出最大价值. 输入格式 第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积. 接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值. 输出格式 输出一个整数,表示最大价值. 数据范围 0<N,V≤1000

动态规划-01背包

先认错,学长们很早之前就讲过了,然而我现在才来写... 01背包 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2--Wn,与之相对应的价值为P1,P2--Pn. 01背包题目的雏形是: 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 从这个题目中可以看出,01背包的特点就是:每种物品仅有一件,可以选择放或不放. 其状态转移方程是: f[i][v]=max{f[i-1][v],f[i-1][v-c

【算法学习笔记】30.动态规划 01背包和完全背包的关系

首先先说明一下01背包和完全背包问题的区别 01背包:有 N 件物品和一个容量为 V 的背包.放入第 i 件物品耗费的费用是 Ci,得到的价值是 Wi.求解将哪些物品装入背包可使价值总和最大.(可以不装满) 完全背包:有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用.放入第 i 种物品 的费用是 Ci,价值是 Wi.求解:将哪些物品装入背包,可使这些物品的耗费的费用总和不超过背包容量,且价值总和最大. 先说结论: 两个问题的最优解都要用DP来解决,实现的过程也非常像只是在内层循环中

动态规划——01背包

转 https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html 问题描述:有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 三.动态规划的原理及过程: eg:number=4,capacity=8 i 1 2 3 4 w(体积) 2 3 4 5 v(价值) 3 4 5 6       定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值:   寻找递推关系式,面对当

动态规划 01背包学习中

#include<iostream> #include<math.h> #include<stdio.h> using namespace std; //int ct=0; //int arr[1000]={0}; struct Bag{ int kg; int value; }; Bag sth[6]={0,0,2,6,2,3,6,5,5,4,4,6}; int bag[8][11]={0}; void dongtaiguihjua() { for(int i=5;i

POJ1837:Balance(01背包)

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