P1060 開心的金明

/*
題型:0,1揹包
注意:動態轉移方程的寫法
for(int i=1;i<=n;i++)
   for(int j=high;j>=a[i].price;j--)
   f[j]=max(f[j],f[j-a[i].price]+a[i].value) 
*/ 

#include <bits/stdc++.h> //萬能頭文件
using namespace std;//std工具箱
struct shopping {//結構體shopping
int price,important,value;//定義了數據 ,用price記錄金錢,important記錄重要值,value記錄乘積
} a[1000000];       //數組開大一點不然會RE,我也不清楚
int f[1000000];
int main() {
    int high,n;
    cin>>high>>n;  //輸入數據high n
    for(int i=1; i<=n; i++) {
        cin>>a[i].price>>a[i].important; //循環時來處理數據,分別輸入
        a[i].value=a[i].important*a[i].price;//將其乘積記錄起來
    }
    for(int i=1; i<=n; i++)         
        for(int j=high; j>=a[i].price; j--)//第一重循環表示行數,相當於我們在列一個表格
            f[j]=max(f[j],f[j-a[i].price]+a[i].value);//動態轉移方程,核心部分
//轉移方程的意義是:如果第j個狀態之前即第j-1個狀態放入一個傢俱,並且放入後總價值大於第j個狀態的價值,則第j-1個狀態時選擇放入  
                 cout<<f[high];//輸出high的值
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章