背包问题(旅游记得带零钱)

Description

卖方:这件商品14元
买方:给你20元
卖方:不好意思,我的零钱不够
买方:好吧,这是15元,剩的当小费

当到一个地方旅游时,如果你买东西的地方不支持信用,带零钱还是非常有用的。特别是有时候卖方没有零钱,如果你没有刚好的钱,你需要支付比卖价多一点。

当然你想付尽量少的钱(至少是商品价值的钱)。并且,当支付最少钱的时候,也最好是支付的硬币的数量最少。

Input

第一行包含一个整数表示测试数据的组数。每组测试数据每一行包含一个整数,表示你需要付的钱数,钱数不超过10000元。接下来包含一个整数n,表示你所拥有的钱的数量,n最多是100,接下来的n行每行一个整数,表示你有的每个硬币的面值,注意钱的面值可以是任意的,不和我们现在用的面值一样,钱的面值不超过10000元。

Output

对每组测试数据,在一行上输出两个整数:需要支付的钱数和数量。

Sample Input

1
1400
3
500
1000
2000

Sample Output

1500 2

基本思路

数组a用来存储钱的种类,从a[1]开始输入,a[0]置成0,sum为钱数总和。因为要输出最少的钱和最少的张数,当a[i]出现price时,直接输出a[i],钱的张数为1。
如果a[i]中没有和price相等的值,用数组dp。dp[0][0]置成1,数组第一行从dp[0][1]开始,附成0,数组第一行从1到num,dp[i][0]都赋成1。从头开始查找,如果j<a[i],dp[i][j]=dp[i-1][j];当j>=a[i]的时候,说明出现可以支付的钱,运用公式dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]]。
开辟数组b用来存放dp数组中值为1的数。然后对数组b中的值进行排序,从小到大。当b中出现第一个值比price大的数,他就是要找的最少的钱数,将其输出。用count来记录钱的张数,如果输出的钱数比输入的a[i]中的值大,证明一张a[i]不够支付,count就要+1。如果数组b中最大的数都比price小,说明没有足够的钱支付。

注意:数组要开的足够大!!!!

运行代码

#include<iostream>
#include<malloc.h>
 
using namespace std;
int dp[101][30400];
int b[20001];
int a[101];
int main()
{
   
    int n,price,num,i,sum=0,k=0,m=0,j,count=0,p;
    cin>>n;
    while(n--)
    {
   
        cin>>price>>num;
        //if(price>100)
//       int *a=new int[num];
        a[0]=0;
        sum=0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
背包问题是一个经典的动态规划问题,其中背包有一定的容量,物品有不同的体积和价值。目标是在不超过背包容量的情况下,使得放入背包的物品总价值最大化。 下面是一个用C++实现的体积的背包问题的代码示例: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int knapsack(int capacity, vector<int>& volumes, vector<int>& values, int n) { // 创建一个二维数组来保存动态规划的结果 vector<vector<int>> dp(n+1, vector<int>(capacity+1, 0)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= capacity; j++) { if (volumes[i-1] <= j) { // 当前物品的体积小于等于背包容量时,可以选择放入或不放入背包 dp[i][j] = max(values[i-1] + dp[i-1][j-volumes[i-1]], dp[i-1][j]); } else { // 当前物品的体积大于背包容量时,只能选择不放入背包 dp[i][j] = dp[i-1][j]; } } } return dp[n][capacity]; } int main() { int capacity = 10; // 背包容量 vector<int> volumes = {2, 3, 4, 5}; // 物品的体积 vector<int> values = {3, 4, 5, 6}; // 物品的价值 int n = volumes.size(); // 物品的数量 int maxValue = knapsack(capacity, volumes, values, n); cout << "最大价值为: " << maxValue << endl; return 0; } ``` 这段代码使用动态规划的思想,通过填充一个二维数组 `dp` 来解决背包问题。其中 `dp[i][j]` 表示在前 `i` 个物品中,背包容量为 `j` 的情况下,可以获得的最大价值。最终返回 `dp[n][capacity]` 即可得到结果。 注意,这段代码假设物品的体积和价值已经按照相同的顺序存储在 `volumes` 和 `values` 向量中,并且索引从0开始。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值