1068. Find More Coins

01揹包問題

(1)排序數據爲降序

(2)揹包處理

// 1068. Find More Coins.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include <string.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define max(a, b) ((a) > (b) ? (a) : (b))
const int N = 10003;
int coin[N], dp[103];
vector<int> ans[N];
typedef vector<int>::iterator IT;
typedef vector<int>::reverse_iterator RIT;

bool cmp(int m1, int m2){
	return m1 > m2;
}

int main()
{
	int n, total;
	cin >> n >> total;
	for(int i = 1; i <= n; i++)
		cin >> coin[i];
	coin[0] = 0;
	sort(coin + 1, coin + 1 + n, cmp);
	memset(dp, 0, sizeof(dp));
	for(int i = 1; i <= n; i++){
		for(int j = total; j >= coin[i]; j--){
			if(dp[j] <= dp[j - coin[i]] + coin[i]){
				dp[j] = dp[j - coin[i]] + coin[i];
				ans[j].clear();
				for(IT ite = ans[j - coin[i]].begin(); ite != ans[j - coin[i]].end(); ite++)
					ans[j].push_back(*ite);
				ans[j].push_back(coin[i]);
			}
		}
	}
	if(dp[total] != total)
		cout << "No Solution" << endl;
	else{
		bool flag = true;
		for(RIT ite = ans[total].rbegin(); ite != ans[total].rend(); ite++){
			if(flag){
				flag = false;
				cout << *ite;
			}
			else
				cout << " " << *ite;
		}
		cout << endl;
	}
	return 0;
}



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