SDUT背包(01)换零钱

本文详细解析了不同类型的背包问题,包括0-1背包、一维滚动数组优化及完全背包问题,并提供了具体的C++实现代码示例。文章还介绍了如何通过状态转移方程求解最优解。
https://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2396/pid/2777.html

有背包原理并是不是背包问题。

通过滚动数组来求出和 。

而不是用背包来求最优


1.01背包:

[cpp]  view plain  copy
  1. //从前一个转态转移过来,选还是不选  
  2.     for (int i=1; i<=N; i++){  
  3.         for (int j=0; j<=M; j++){  
  4.             if (weight[i]<=j){  
  5.                 f[i][j]=max(f[i-1][j],f[i-1][j-weight[i]]+value[i]);  
  6.             }  
  7.             else  
  8.                 f[i][j]=f[i-1][j];  
  9.         }  
  10.     }  
    1. //一维滚动数组  
    2. for (int i=1; i<=N; i++)  
    3.     for (int j=M; j>=1; j--)  
    4.         if (weight[i]<=j)  
    5.             f[j]=max(f[j],f[j-weight[i]]+value[i]);  

3.完全背包

[cpp]  view plain  copy
  1. //每件物品可以使用无数次,求最大值  
  2. memset(dp,-INF,sizeof(dp));  
  3. dp[0]=0;  
  4. for(int i=0;i<m;i++)  
  5.     for(int j=c[i];j<=v;j++)  
  6.         dp[j]=max(dp[j],dp[j-c[i]]+w[i]);  
#include <iostream>

using namespace std;

int main()
{
int a[100005],n,x[3]={1,2,3},i,j;
a[0]=1;
for(i=0;i<3;i++)
{
for(j=x[i];j<=32777;j++)
a[j]=a[j]+a[j-x[i]];
}
while(cin>>n)
{
    cout <<a[n]<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值