P1102-P1103

//01背包

// #include <iostream>
// #include <algorithm>
// using namespace std;
// int tim[101];
// int val[101];
// int f[1001];
// int main()
// {
//     int t,m;
//     cin >> t >> m;
//     for(int i = 0; i < m; i++)
//     {
//         cin >> tim[i] >> val[i];
//     }
//
//     for(int i = 0; i < m; i++)
//     {
//         for(int v = t; v >= tim[i]; v--)
//         {
//             if(f[v - tim[i]] + val[i] > f[v])
//             {
//                 f[v] = f[v - tim[i]] + val[i];
//             }
//         }
//     }
//     cout << f[t];
//     return 0;
// }

//还是超内存。。。(背包总是超)

// #include<iostream>
// using namespace std;
// int main()
// {
//     int n,m;
//     cin>>n>>m;
//     int v,p;
//     int dp[30001];
//     for(int i=1;i<=m;i++)
//     {
//         cin>>v>>p;
//         for(int j=n;j>=v;j++)
//         {
//             dp[j]=max(dp[j],dp[j-v]+p*v);
//         }
//     }
//     cout<<dp[n]<<endl;
//     return 0;
// }

//正确答案

#include<cstdio>
#include<algorithm>
#define V 30010
using namespace std;
int dp[V],w[30],v[30],n,m;
int main()
{
int a,b;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
v[i]=a;
w[i]=a*b;
}
for (int j=0;j<=n;j++)
dp[j]=0;
for (int i=1;i<=m;i++)
for (int j=n;j>=0;j--)
if (j-v[i]>=0)
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
printf("%d",dp[n]);
return 0;
}



原文地址:https://www.cnblogs.com/Chri-K/p/13640350.html