算法

一,背包问题
1.题目
一共有N件物品,第i(i从1开始)件物品的重量为w[i],价值为v[i]。在总重量不超过背包承载上限W的情况下,能够装入背包的最大价值是多少?
2.分析
题目要求要装取价值最大的额东西,如果采用暴力穷举的方式,每件物品都存在装入和不装入两种情况,这中方法很复杂。而使用动态规划可以将问题简单化。我们的目标是书包内物品的总价值,而变量是物品和书包的限重,所以我们可定义状态f:
f[i][j]表示将前i件物品装进限重为j的背包可以获得的最大价值, 0<=i<=N, 0<=j<=W
那么我们可以将f[0][0…W]初始化为0,表示将前0个物品(即没有物品)装入书包的最大价值为0。那么当 i > 0 时f[i][j]有两种情况:
(1)不装入第i件物品,即f[i−1][j];
(2)装入第i件物品(前提是能装下),即f[i−1][j−w[i]] + v[i]。
状态转移方程为:
f[i][j] = max(f[i−1][j], f[i−1][j−w[i]]+v[i])
完整代码如下:

#include<stdio.h>   
#define N 1500  
int f[10][N]//全局变量,自动初始化为0
int w[10],v[10];  
#define  max(x,y)   (x)>(y)?(x):(y)
int main()
{
    //状态转移方程 f[i+1][j]=max{f[i][j],f[i][j-w[i+1]+v[i+1]}
    int n,m; 
    scanf("%d%d",&n,&m);//n物品个数 m背包容量 
    for (int i=1;i<=n; i++)  
        scanf("%d%d",&w[i],&v[i]);
    for (int i=1; i<=n; i++)  
        for (int j=1; j<=m; j++)  
        {  
            if (w[i]<=j)  
            {  
                f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);  
            }  
            else  
                f[i][j]=f[i-1][j];  
        }  
      printf("%d\n",f[n][m]);//输出最优解
  }

二,例题
1.题目
近期WYL学长捐钱驰援武汉,已经捐完钱的他发现自己没有钱谈恋爱了,考虑到集训队的群里老会有红包,机智的他稍加思考写了一个程序,程序会在(m, 2m, 3m…)秒的时候自动抢红包。
群里 在1~z秒钟里平均n秒发一个红包( n, 2n, 3n… )。每个红包里都能抢到一块钱,最后需要计算WYL学长到底抢了多少钱?
输入:
输入只有一行三个整数 n,m,z 如题目描述 (1 ≤ n, m, z ≤ 1e4).
输出:
输出抢的红包总金额
Input

1 1 10

Output

10

Input

1 2 5

Output

2

Input

2 3 9

Output

1
2.分析
由题得,每n秒发一个红包,每m秒抢一次红包,所以,当m的某个倍数等于n的某个倍数时就可以强到,但要注意时间z,不/能超过z秒。
可以先算z秒中有多少个n秒,这样就可以保证不会超出时间范围。
完整代码如下:

#include<stdio.h>
int main()
{
 int n,m,z,i,j,x,y,s=0;
 scanf("%d %d %d",&n,&m,&z);
 x=z/n;//计算z秒中有多少个n秒
 y=x*n;//y是m可达到的最大的数
 for(i=n;i<=y;i+=n)
 {
  for(j=1;j<=z;j++)
  {
   if((m*j)==i)//若m的j倍等于i则s+1
    s++;
   else
    continue; 
  }
 }

 printf("%d",s);//输出结果
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值