boj 343

2024-05-26 09:58
文章标签 343 boj

本文主要是介绍boj 343,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description
Tradia最近去了趟超市,采购了好多好吃的东西,其中花花绿绿的巧克力最是诱人。为了感谢Jim前段时间对自己的帮助,Tradia决定把自己的巧克力分一些给Jim。但是Tradia也爱吃巧克力,她不想把自己全部的巧克力都给Jim,而是把巧克力平均分配,使得给Jim的总量和留给自己的总量之差最小。聪明的你能帮助她吗?

Input
输入包含多组测试数据。
首先第一行输入一个数T(T<=50),表示总共有T组测试数据。
接下来是每组测试数据,第一行是一个数N(N<=20),表示一共有N个巧克力。接着是这N个巧克力的描述,用一个正数M(M<=10000)表示巧克力的质量。


Output
首先,输出Case #X:其中X代表是第X组数据(具体格式参照样例)。
然后输出每组数据的答案,即最小差值。


Sample Input

2
1
5
2
2 3


Sample Output

Case #1:
5
Case #2:
1


Source
humanjustic@Fourth

思路:

转换为0-1背包求解

代码:

#include<iostream>
using namespace std;
int dp[100005];
int arr[25];
int main()
{int t;scanf("%d",&t);for(int k=1;k<=t;k++){int n,sum = 0;scanf("%d",&n);memset(dp,0,sizeof(dp));for(int i=0;i<n;i++){scanf("%d",&arr[i]);sum+=arr[i];}int v = sum/2;for(int i=0;i<n;i++)for(int j=v;j>=arr[i];j--)dp[j] = max(dp[j-arr[i]]+arr[i],dp[j]);printf("Case #%d:\n%d\n",k,abs(sum-2*dp[v]));}
}

 

这篇关于boj 343的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004139

相关文章

代码随想录:343. 整数拆分

343. 整数拆分   class Solution {public:int integerBreak(int n) {int dp[100]={0};//拆分i的最大乘积为dp[i]dp[1]=1;//初始化,主要是为了dp[2]初始for(int i=2;i<=n;i++){for(int j=1;j<i;j++){ dp[i]=max(dp[i],max(j,dp[j])*ma

【动态规划】343. 整数拆分

力扣链接:343. 整数拆分 - 力扣(LeetCode) dp数组的含义:dp[i]表示对i拆分,得到最大的积为dp[i] 递推公式:拆成两个数是 j*(i-j),拆成三个及以上是 j*dp[i-j],所以递推公式取两者大值 遍历顺序:从小到大 public int integerBreak(int n) {int[] dp = new int[n+1];dp[1]=0;dp[2]=

代码随想录训练营day34|62.不同路径,63. 不同路径 II,343.整数拆分,96.不同的二叉搜索树

不同路径1 题目 题目并不难想,每一个点只有两种走到的方法,要么从左侧来,要么从上侧来,所以 dp[i][j]=dp[i-1][j]+dp[i][j-1]; vector<vector<int>> dp(m,vector<int>(n,0)); for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(i>0&&j>0){dp[i][j]=dp[i-1][

DP-343. 整数拆分

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n = 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。 示例 2: 输入: n = 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 提示: 2 <= n <=

力扣(动态规划)-343整数拆分;96不同的二叉搜索树

整数拆分 题目: 给定⼀个正整数 n,将其拆分为⾄少两个正整数的和,并使这些整数的乘积最⼤化。 返回你可以获得的最⼤乘积。 示例 1: 输⼊: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。 示例 2: 输⼊: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 提示: 2 <= n <= 58 说明: 你

343.整数拆分

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 :数学推导,将n分为3a+b,乘积最大 复杂度 1 1 public int integerBreak(int n){if(n <= 3) return n - 1;int a = n / 3, b = n % 3;if(b == 0) return (i

代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II 343.整数拆分 96.不同的二叉搜索树

LeetCode 62.不同路径 题目链接:62.不同路径 踩坑:二维的vector数组需要初始化,否则会报错访问空指针 思路: 确定动态数组的含义:dp[i][j]:到达(i,j)有多少条路经递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]初始化动态数组:dp[0][0] = 1遍历顺序:从左到右,从上到下 代码: class Solution {pu

动态规划02(Leetcode62、63、343、96)

参考资料: https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html 62. 不同路径 题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

代码随想录算法训练营Day39|62.不同路径、63.不同路径II、343.整数拆分、96.不同的二叉搜索树

不同路径 62. 不同路径 - 力扣(LeetCode) 机器人位于m*n网格的左上角,机器人每次只能向下或向右移动一步(移动方向只有下和右,固定了不能回返路径)。机器人需要达到网格的右下角,需要得到共有多少条路径。 思路:使用动态规划来解决,这里需要得到动态规划的dp矩阵,以及dp矩阵的推演公式。 这里我们假定dp矩阵为m*n的矩阵,dp[i][j]为能抵达 i -1,j-1的路径总数,

leetcode打卡#day42 62. 不同路径、63. 不同路径 II、343. 整数拆分、96. 不同的二叉搜索树

62. 不同路径 class Solution {public://动态规划int uniquePaths(int m, int n) {//dp数组,记录到达目的地的路径数vector<vector<int>> dp(m, vector(n, 0));//初始化for(int i=0; i< m; i++) dp[i][0] = 1;for(int i=0; i< n; i++) dp[0]