二维费用背包 尽量前后一直把好像也没关系
看清题目问的是什么
读懂题目vw是什么
include <bits/stdc++.h>
using namespace std;
int dp[105][105];//i忍耐度杀了 j时候的经验值
int v[105];int w[105];
int main()
{
int n,m,k,s;
while(cin>>n>>m>>k>>s)
{
memset(dp,0,sizeof(dp));
memset(v,0,sizeof(v));
memset(w,0,sizeof(w));
for(int i=1;i<=k;i++)
{
cin>>w[i]>>v[i];
}
int mn=0x3f3f3f3f;//哨兵
for(int i=1;i<=k;i++)
{
for(int j=v[i];j<=m;j++)
{
for(int k=1;k<=s;k++)//达到最大经验值是保留的最小忍耐度
{
dp[j][k]=max(dp[j][k],dp[j-v[i]][k-1]+w[i]);
if(dp[j][k]>=n) mn=min(mn,j);//积累
}
}
}
if(mn==0x3f3f3f3f) cout<<-1<<endl;
else cout<<m-mn<<endl;//一定要看清题目啊啊啊啊
}
}

浙公网安备 33010602011771号