You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.6 KiB

2 years ago
#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;
}