1. 程式人生 > 實用技巧 >Thymeleaf 模板引擎

Thymeleaf 模板引擎

揹包問題

問題描述

  給定n種物品,1個揹包,揹包容量為c,每個物品i的價值為vi,重量為wi,如何選擇裝入物品能使揹包的總價值最大?

  注意:與0-1揹包問題不同,在選擇物品i裝入揹包時,可以選擇物品i的一部分,而不一定要全部裝入揹包,1<=i<=n

形式化描述

  給定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量A=(x1,x2,…,xn),0<=xi<=1【0~1表示取物品的某一部分】,1<=i<=n,使得∑ wixi≤c【物品的重量和小於揹包總容量】而且∑ vi

xi達到最大。

演算法思路:

  將物品按照單位重量價值進行排序(從大到小),將盡可能多的單位重量價值最高的物品裝入揹包,若將這種物品全部裝入揹包後,揹包還有多餘容量,則選擇單位重量價值次高的並儘可能多地裝入揹包。如果最後一件物品無法全部裝入,則計算可以裝入的比例,然後按比例裝入。

程式碼實現:

#include<iostream>
#include<bits/stdc++.h>

using namespace std;
struct item{
    int weight;
    int value;
    float pervalue;
    float
rate; }; bool cmp(const item & a, const item &b ){ return a.pervalue<b.pervalue; } int main(){ int n;//n件物品 float c;//揹包容量為c cout<<"輸入物品件數和揹包容量:"<<endl; cin>>n>>c; item * items = new item[n]; cout<<"依次輸入每件物品的價值和重量:"<<endl;
float v[n],w[n];//v[n]:n件物品的價值,w[n]:n件商品的重量 for(int i=0;i<n;i++){ cin>>items[i].value>>items[i].weight; items[i].pervalue=items[i].value/items[i].weight;//計算單位重量價值 items[i].rate=0;//初始化每件物品的使用率 } sort(items,items+n,cmp); for (int i = n-1; i >= 0; i--) { if (c<=0) break; if (items[i].weight<=c) { items[i].rate=1; c-=items[i].weight; }else { items[i].rate=c/items[i].weight; c=0; } } for (int j = n-1; j >= 0; j--) { cout<<"重:"<<items[j].weight<<" 價值:"<<items[j].value<<" 被放入了揹包"<<endl<<"放入比例:"<<items[j].rate<<endl; } }