华师一附中OI组
标题:
P1049 装箱问题
[打印本页]
作者:
倚窗倾听风吹雨
时间:
2018-7-15 09:35
标题:
P1049 装箱问题
https://www.luogu.org/problemnew/show/P1049
题目描述
有一个箱子容量为 V (正整数,V≤20000 ),同时有 n 个物品(0<n≤30),每个物品有一个体积(正整数)。
要求 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入输出格式
输入格式:
1 个整数,表示箱子容量
1 个整数,表示有 n 个物品
接下来 n 行,分别表示这 n 个物品的各自体积
输出格式:
1 个整数,表示箱子剩余空间。
输入输出样例
输入样例#1:
24
6
8
3
12
7
9
7
输出样例#1:
0
说明
NOIp2001普及组 第4题
作者:
倚窗倾听风吹雨
时间:
2018-7-15 09:35
#include<iostream>
using namespace std;
int v,n,a[50],f[50][20010],ans;
int i,j;
int main()
{
cin>>v;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
{
for(j=1;j<=v;j++)
{
f[i][j]=f[i-1][j];
if(j-a[i]>=0)
if(f[i-1][j-a[i]]+a[i]>f[i][j])
f[i][j]=f[i-1][j-a[i]]+a[i];
///cout<<i<<" "<<j<<" "<<f[i][j]<<endl;
}
}
ans=v-f[n][v];
cout<<ans;
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-8-29 16:13
#include<iostream>
#include<algorithm>
using namespace std;
int w[35];
int n,ans,V;
int dp[20005];
int main()
{
cin>>V>>n;
for(int i=1;i<=n;i++)cin>>w[i];
for(int i=1;i<=n;i++)
for(int j=V;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
ans=*max_element(dp+1,dp+V+1);
cout<<V-ans;
return 0;
}
复制代码
作者:
Scorpio
时间:
2018-10-2 10:12
#include<iostream>
using namespace std;
int a[31],f[21000];
int i,j,v,n;
int main()
{
cin>>v>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
for(j=v;j>=a[i];j--)
f[j]=max(f[j-a[i]]+a[i],f[j]);
cout<<v-f[v];
return 0;
}
复制代码
作者:
admin
时间:
2020-4-6 11:09
用dfs来一波,训练PMN
#include <iostream>
using namespace std;
int ans=999999;
int n,V,a[40],sum;
bool b[40];
void pr()
{
if (sum<=V) ans=min(ans,V-sum);
}
void dfs(int i)
{
if (i>n) pr();
else
{
b[i]=0; ///不选 没变化
dfs(i+1);
b[i]=1;///选了
sum+=a[i];///总和加了
if (sum<=V) dfs(i+1);
sum-=a[i];///退回去
}
}
int main()
{
cin>>V>>n;
for (int i=1; i<=n; i++) cin>>a[i];
dfs(1);
cout<<ans;
}
复制代码
作者:
admin
时间:
2020-6-13 19:53
背包(DP)思路来一波,简单的DP
#include<bits/stdc++.h>
using namespace std;
int f[20020][40];
int V,N,a[40];
int main()
{
int ans=0;
cin>>V>>N;
for (int i=1; i<=N; i++) cin>>a[i];
f[0][0]=1;
for (int n=1; n<=N; n++)
for (int v=0; v<=V; v++)
{
int t1=f[v][n-1];///buzhuang
int t2;
if (v>=a[n]) t2=f[v-a[n]][n-1];
else t2=0;/// yaozhuang
f[v][n]=t1||t2;
}
ans=20019;
while (f[ans][N]==0) ans--;
cout<<V-ans;
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2