完全背包问题-动态规划

来源:互联网 发布:python和qt 编辑:程序博客网 时间:2024/05/22 15:11
  • 题目描述
    设有N种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从N种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。
  • 输入
    第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);第2..N+1行:每行二个整数wi,vi,表示每个物品的重量和价值。
  • 输出
    仅一行,一个数,表示最大总价值。
  • 样例输入
    10 4
    2 1
    3 3
    4 5
    7 9
  • 样例输出
    max=12

  • Analysis
    使用一个数组f[],其中f[i]表示使用背包i的容量时可以得到的最大价值,f[M]即为解

  • 源代码
#include <iostream>#include <cstdio> #include <algorithm> using namespace std;int w[300],v[300],f[210];int M,N; int main(){       scanf("%d%d",&M,&N);    for(int i=1;i<=N;i++)        scanf("%d%d",&w[i],&[i]);    for(int i=1;i<=N;i++)        for(int j=w[i];j<=M;j++)            f[j]=max(f[j],f[j-w[i]]+v[i]);     printf("\nmax=%d\n",f[M]);     return 0; }