|
|
|
|
#include<bits/stdc++.h>
|
|
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
֪ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD>滮<EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
<EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲο<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
https://www.cnblogs.com/aiguona/p/7274876.html
|
|
|
|
|
*/
|
|
|
|
|
#define MAX 1000000
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
int dp[MAX]; //<2F>洢<EFBFBD><E6B4A2><EFBFBD><EFBFBD><F3B1B3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
int value[MAX], weight[MAX], number[MAX];//<2F>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD>ļ<EFBFBD>ֵ<EFBFBD><D6B5>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
int bag;
|
|
|
|
|
|
|
|
|
|
void ZeroOnePack(int weight, int value)//01<30><31><EFBFBD><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
for (i = bag; i >= weight; i--) {
|
|
|
|
|
dp[i] = max(dp[i], dp[i - weight] + value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CompletePack(int weight, int value)//<2F><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
for (i = weight; i <= bag; i++) {
|
|
|
|
|
dp[i] = max(dp[i], dp[i - weight] + value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MultiplePack(int weight, int value, int number)//<2F><><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
if (bag <= number * weight)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҪС<D2AA><D0A1><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>ȡ<EFBFBD>꣬<EFBFBD>൱<EFBFBD><E0B5B1><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
CompletePack(weight, value);
|
|
|
|
|
return;
|
|
|
|
|
} else//<2F><><EFBFBD><EFBFBD><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>ת<EFBFBD><D7AA>Ϊ01<30><31><EFBFBD><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
int k = 1;
|
|
|
|
|
while (k <= number) {
|
|
|
|
|
ZeroOnePack(k * weight, k * value);
|
|
|
|
|
number = number - k;
|
|
|
|
|
k = 2 * k;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD>˼<EFBFBD><CBBC>
|
|
|
|
|
}
|
|
|
|
|
ZeroOnePack(number * weight, number * value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
int n;
|
|
|
|
|
while (~scanf("%d%d", &bag, &n)) {
|
|
|
|
|
int i, sum = 0;
|
|
|
|
|
for (i = 0; i < n; i++) {
|
|
|
|
|
scanf("%d", &number[i]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
scanf("%d", &value[i]);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
memset(dp, 0, sizeof(dp));
|
|
|
|
|
for (i = 0; i < n; i++) {
|
|
|
|
|
MultiplePack(value[i], value[i], number[i]);//<2F><><EFBFBD>ö<EFBFBD><C3B6>ر<EFBFBD><D8B1><EFBFBD>,ע<><EFBFBD>ε<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
cout << dp[bag] << endl;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|