B3873 GESP202309 六级 小杨买饮料 - 洛谷

输入输出样例:
输入1:
5 100
100 2000
2 50
4 40
5 30
3 20
输出1:
9
输入2:
5 141
100 2000
2 50
4 40
5 30
3 20
输出2:
100
输入3:
4 141
2 50
4 40
5 30
3 20
输出3:
no solution
代码1:
#include<bits/stdc++.h>
using namespace std;
int dp[510][2010];
int c[510],l[510];
int main(){
int n,L;
cin>>n>>L;
for(int i=1;i<=n;i++)
cin>>c[i]>>l[i];
memset(dp,0x7f,sizeof dp);
for(int i=0;i<=509;i++)
dp[i][0]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=L;j++)
if(l[i]>=j) dp[i][j]=min(c[i],dp[i-1][j]);
else dp[i][j]=min(c[i]+dp[i-1][j-l[i]],dp[i-1][j]);
if(dp[n][L]==0x7f7f7f7f)
cout<<"no solution";
else
cout<<dp[n][L];
return 0;
}
代码2:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[510][2010];
int c[510],l1[510];
signed main(){
int n,l;
cin>>n>>l;
for(int i=1;i<=n;i++)
cin>>c[i]>>l1[i];
for(int i=0;i<=n;i++)
for(int j=0;j<=l;j++)
dp[i][j]=INT_MAX;
for(int i=0;i<=n;i++)
dp[i][0]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=l;j++)
if(l1[i]>=j) dp[i][j]=min(c[i],dp[i-1][j]);
else dp[i][j]=min(c[i]+dp[i-1][j-l1[i]],dp[i-1][j]);
if(dp[n][l]==INT_MAX)
cout<<"no solution";
else
cout<<dp[n][l];
return 0;
}