描述
给一些不同价值和数量的硬币。找出[1,n]范围内的总值有多少种形成方式?
题目链接:https://www.lintcode.com/problem/799/
方法一:递归

#include "iostream"
#include "vector"
#include "cstring"
using namespace std;
int process(vector<int> &value, vector<int> &amount, int index, int n) {if (index == value.size()) {return n == 0 ? 1 : 0;}int way = 0;for(int i = 0; i <=amount[index]; i++){way = way || (process(value, amount, index + 1, n) || process(value, amount, index + 1, n - i * value[index]));}return way;
}
int main(){vector<int> value;value.push_back(1);value.push_back(2);value.push_back(4);vector<int> amount;amount.push_back(2);amount.push_back(1);amount.push_back(1);int n = 10;int ans = 0;for(int i = 1; i <= n; i++){ans += process(value, amount, 0, i); }cout << ans; return 0;
}

方法二:dp(二维数组)

class Solution {public:/*** @param n: the value from 1 - n* @param value: the value of coins* @param amount: the number of coins* @return: how many different value*/int backPackVIII(int n, vector<int> &value, vector<int> &amount) {// write your code hereint dp[value.size() + 1][n + 1];memset(dp, 0, sizeof(dp));dp[value.size()][0] = 1;for(int i = value.size() - 1; i >= 0; i--){for(int j = 0; j <= n; j++){dp[i][j] = dp[i][j] || dp[i + 1][j];if(dp[i][j] == 1){continue;}for(int k = 0; k <= amount[i] && k * value[i] <= j; k++){dp[i][j] = dp[i][j] || dp[i + 1][j - k * value[i]];if(dp[i][j] == 1){break;}}}}int ans =0;for(int i = 1; i <= n; i++){ans += dp[0][i];}return ans;}
};

方法三:dp(一维数组)

#include "iostream"
#include "vector"
#include "cstring"
using namespace std;
int main(){vector<int> value{1,2,4};vector<int> amount{2,1,1};int n = 10;vector <int> dp(n + 1);dp[0] = 1;int sum = 0;for (int i = 0; i < value.size(); i++) {for (int j = 0; j <= n; j++) {//之前已经组成的,那么本次就可以传递 amount[i] 次。if (dp[j] >= 1) {dp[j] = amount[i] + 1;} else if (j >= value[i] && dp[j - value[i]] >= 2) {//之前标记的 amount[j - value[i]] > 1 说明还没传递完,继续传递dp[j] = dp[j - value[i]] - 1;}}}for (int i = 1; i <= n; i++) {if (dp[i] >= 1) {sum++;}}cout << sum;return 0;
}

799 - 背包问题VIII - LintCode相关推荐

  1. 798 - 背包问题VII - LintCode

    描述 假设你身上有 n 元,超市里有多种大米可以选择,每种大米都是袋装的,必须整袋购买,给出每种大米的重量,价格以及数量,求最多能买多少公斤的大米 题目链接:https://www.lintcode. ...

  2. 动态规划之背包类问题详细介绍(代码模板)和例题练习

    文章目录 0-1 背包问题 问题概述 0-1背包代码模板 0-1背包例题 完全背包问题 问题概述 完全背包代码模板 完全背包例题 多重背包问题 问题概述 多重背包代码模板 多重背包例题 混合背包问题 ...

  3. LintCode 92.背包问题

    描述 在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i] 样例 样例 1:输入: [3,4,8,5], backpack size=10输出: 9样例 2:输 ...

  4. LintCode 563. 背包问题 V(DP)

    1. 题目 给出 n 个物品, 以及一个数组, nums[i] 代表第i个物品的大小, 保证大小均为正数, 正整数 target 表示背包的大小, 找到能填满背包的方案数. 每一个物品只能使用一次 样 ...

  5. LintCode 125. 背包问题 II(DP)

    1. 题目 有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小 数组 V 表示每个物品的价值. 问最多能装入背包的总价值是多大? 样例 1: 输入: m = 10, A = [ ...

  6. 【LintCode】Backpack 背包问题

    在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]. 样例 如果有4个物品[2, 3, 5, 7] 如果背包的大小为11,可以选择[2, 3, 5]装入背包, ...

  7. 背包问题概述(Lintcode- 562.Backpack IV问题解决)

    2019独角兽企业重金招聘Python工程师标准>>> 什么是背包问题 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物 ...

  8. LintCode解题目录

    看见 LintCode 的代码能力测试CAT(Coding Ability Test)挺好,有倒计时,挺有面试紧迫感.做个记录. 另有本人 LeetCode解题目录.<程序员面试金典>解题 ...

  9. 基因算法解析、设计,以解决背包问题和旅行商问题为例

    一.算法说明 基因算法 基因算法有一套公共的完整的框架,伪代码如下. beginset time t = 0 # first generationinitGeneration() # initiali ...

最新文章

  1. javascript专业八级测试答案整理
  2. 【三代增强干货一枚】外向交货单Delivery (VL01N)Header屏幕增强
  3. [云炬创业基础笔记]第二章创业者测试1
  4. python 立方体切割块数_blender python通过三角函数调整立方体Location排成圆
  5. Unity - Humanoid设置Bip骨骼导入报错
  6. linux chmod修改权限失败,【Linux】chmod修改文件权限
  7. 【转载保存】cookie在登录时的使用
  8. 正则提取 html 里input 标记的value 值
  9. linux下Eclipse连接真机调试Android应用程序
  10. 视频+案例 | 钟南山院士谈5G医疗
  11. Latex通过bib文件转出bbl文件
  12. 鸿蒙OS到底是不是Android套皮?(少bb,看源码!)
  13. 服务器机房消防系统,服务器机房消防系统和维护
  14. 前端需要的这些你都学会了吗?
  15. 私网地址与公网地址是如何转换的?
  16. SAP FICO 成本对象控制解析
  17. 安装SQL Server 2000时“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机”错误的排除
  18. 浅谈雷达在气象领域的基本应用
  19. Oracle like 走索引
  20. 在x64上构建智能家居(home assistant) (三) 功能介绍 addons,hacs安装

热门文章

  1. 大神尝试扒迅雷的代码,竟然被扒了个精光!
  2. 【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】
  3. 王恩东:摩尔定律的终结本质上是没有革命性技术
  4. 如何设置国际PayPal
  5. 计算机目录排版的文章,自动生成目录,论文排版看这一篇就够了
  6. C语言,往排好序的数组中插入元素
  7. 登录mysql报错Failed to connect to backoff 或 Failed to get D-Bus connection: Operation not permitted解决方法
  8. jQuery实现可移动(draggable)和可缩放(sizable)网页元素
  9. rs485接口上下拉_详解RS-485上下拉电阻的选择
  10. 禁止ios版本上拉回弹效果