完全背包问题

来源:互联网 发布:js跨域解决方案c# 编辑:程序博客网 时间:2024/05/22 12:28

Problem Description

设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为m,今从n种物品中选取若干件(用一个物品可以多次选取),使其重量的和小于等于m,而价值的和为最大。

Input

输入有多组数据,对于每组输入数据第1行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);
第2行至N+1行:每行两个整数Wi,Ci,表示每个物品的重量和价值。

Output

对于每组输入输出一个数,表示最大总价值。

Sample Input

10 42 13 34 57 9

Sample Output

max=12
/*  01背包问题是从后面(大往小)往前走,排除了物品可以重复用的可能  完全背包式从前面(小往大)往后走,其中一个物品可以多次使用*/#include<cstdio>#include<string.h>#include<iostream>using namespace std;int max(int x, int y){    if(x > y) return x;    else return y;}int main(){    int m, n, i, j, v;    int w[35];//重量    int c[35];//价值    int f[205][205] = {0};    while(scanf("%d%d", &m, &n) != EOF)    {        memset(f, 0, sizeof(f));        for(i = 1; i <= n; i++)            scanf("%d%d", &w[i], &c[i]);        for(i = 1; i <= n; i++)        {            //f[i][v]表示前i件物品,总重量不超过v的最优解            for(v = 1; v <= m; v++) //十个背包            {                if(w[i] <= v) f[i][v] = max(f[i - 1][v], f[i][v - w[i]] + c[i]);                else f[i][v] = f[i - 1][v];            }            /*一维数组            for(v=w[i];v<=m;v++)              if(f[v]<f[v-w[i]]+c[i]) f[v]=f[v-w[i]]+c[i];*/        }        printf("max=%d\n", f[n][m]);//最优解    }    return 0;}

 
0 0
原创粉丝点击