动态规划2-Charm Bracelet(算法基础 第5周)

问题描述:

分析
买手链,每个收敛有wi和di属性,wi相当于价格,di相当于价值。我们手中wi总值为M(相当于共有M钱),买尽可能多的di。
状态转移方程:
next[j] = max(last[j], last[j-wi]+di);
next[j]表示加入一个新的手链后用j钱能得到的最大di总和,它的就等于买下这个手链或不买这个手链两种可能性。last[j]表示在当前手链之前用j能得到的最大di总和。
源码:

#include<iostream> 
#include <vector>
using namespace std;  

int main(){  
    int N, M;
    cin >> N >> M;
    int wi, di;
    vector<int> last(M+1, 0);
    vector<int> next(M+1, 0);
    for (int i=0; i<N; i++)
    {
        cin >> wi >> di;
        copy(next.begin(), next.end(), last.begin());
        for(int j=wi; j<=M; j++) {
            next[j] = max(last[j], last[j-wi]+di);
        }
    }
    cout << next[M] << endl;
    return 0;  
}  

你可能感兴趣的:(动态规划2-Charm Bracelet(算法基础 第5周))