P1097-P1099

//01背包
#include<iostream>
using namespace std;
int main()
{
    int v,n;
    cin>>v>>n;
    int w,c;
    int dp[1010];
    for(int i=1;i<=n;i++)
    {
        cin>>w>>c;
        for(int j=v;j>=w;j--)
        {
            dp[j]=max(dp[j],dp[j-w]+c);
        }
    }
    cout<<dp[v]<<endl;
    return 0;
}
 
 
 
//超内存。。。完全背包
// #include<iostream>
// using namespace std;
// int main()
// {
//     long long v,n;
//     cin>>v>>n;
//     long long w;
//     long long dp[100010];
//     dp[0]={1};
//     for(long long i=1;i<=v;i++)
//     {
//         cin>>w;
//         for(long long j=w;j<=n;j++)
//         {
//                 dp[j]=dp[j]+dp[j-w];
//         }
//     }
//     if(n==0&&v==0)
//     {
//         cout<<0;
//     }
//     else
//     {
//         cout<<dp[n]<<endl;
//     }
//     return 0;
// }
//正解
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <utility>
using namespace std;
int m,n,we[40],jz[40],dp[300],maxn;
int main()
{
scanf("%d%d",&m,&n);
for (int i = 1;i <= n;i++)
scanf("%d%d",&we[i],&jz[i]);
for (int i = 1;i <= n;i++)
for (int j = we[i];j <= m;j++)
dp[j] = max(dp[j],dp[j - we[i]] + jz[i]);
for (int i = 1;i <= m;i++)
maxn = max(maxn,dp[i]);
printf("max=%d",maxn);
return 0;
}
 
 
//完全背包,又超内存。。。
//正解
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
using namespace std;
int v,n,sz[30];
long long dp[11000];
void swork()
{
for (int i = 1;i <= v;i++)
{
for (int j = 1;j <= n;j++)
{
if (j - sz[i] >= 0)dp[j] = dp[j - sz[i]] + dp[j];
}
}
}
int main()
{
scanf("%d%d",&v,&n);
for (int i = 1;i <= v;i++)
scanf("%d",&sz[i]);
dp[0] = 1;
swork();
printf("%lld ",dp[n]);
return 0;
}
原文地址:https://www.cnblogs.com/Chri-K/p/13640290.html