SJTUOJ 1013. 无限背包

问题内容

escription
你现在有一个体积为V的大袋子,有N种物品,假设每种物品的数量有无限多个,而且第i种物品的体积是c[i],价值是w[i],请选择一些物品放入袋中,使袋中物品的价值总和最大。

注意每种物品的数量是无限多的;对于放入袋中的同种物品数量没有限制。

Input Format
第一行包含两个正整数V和N,分别代表袋子的体积和物品的种类数。

以下N行分别由2个正整数组成,代表每种物品的体积和价值。

V≤10000,N≤1000。

保证操作可在C++ int范围内完成。

Output Format
输出一个整数,表示最大的价值总和

Sample Input
5 3
2 3
3 2
4 1
Sample Output
6

代码实现

#include <stdio.h>
#define LEN 1000

int val[LEN];
int vol[LEN];
int main()
{
    double minRatio = 0;
    int v, n, i, idx, cnt, value;

    while(scanf("%d %d",&v,&n)!=EOF){
        for(i = 0,value = 0; i < n; i++){
            scanf("%d %d", &vol[i], &val[i]);
        }
        while(1){
            
            for(i = 0, minRatio = 0; i < n; i++){
                if(vol[i] < v){
                    if(!minRatio){
                        minRatio = 1.0 * val[i] / vol[i];
                        idx = i;
                    }
                    else{
                        if(minRatio < 1.0 * val[i] / vol[i]){
                            minRatio = 1.0 * val[i] / vol[i];
                            idx = i;
                        }
                    }
                }
            }
            if(!minRatio){
                break;
            }
            cnt = v/vol[idx];
            v -= cnt * vol[idx];
            value += cnt*val[idx];
        }
        printf("%d\n",value);
    }
    return 0;
}

很久以前做杨辉三角的时候问学长:“这真的属于动态规划吗?”学长反问我:“你真的懂什么是动态规划吗?”

猜你喜欢

转载自blog.csdn.net/Phoenix5443/article/details/85215363